精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis 的內存淘汰策略和過期刪除策略,你別再搞混了!

數據庫 Redis
Redis 是可以對 key 設置過期時間的,因此需要有相應的機制將已過期的鍵值對刪除,而做這個工作的就是過期鍵值刪除策略。

大家好,我是小林。

Redis 的「內存淘汰策略」和「過期刪除策略」,很多小伙伴容易混淆,這兩個機制雖然都是做刪除的操作,但是觸發的條件和使用的策略都是不同的。

今天就跟大家理一理,「內存淘汰策略」和「過期刪除策略」。

發車!

圖片

過期刪除策略

Redis 是可以對 key 設置過期時間的,因此需要有相應的機制將已過期的鍵值對刪除,而做這個工作的就是過期鍵值刪除策略。

如何設置過期時間?

先說一下對 key 設置過期時間的命令。設置 key 過期時間的命令一共有 4 個:

  • expire <key> <n>:設置 key 在 n 秒后過期,比如 expire key 100 表示設置 key 在 100 秒后過期;
  • pexpire <key> <n>:設置 key 在 n 毫秒后過期,比如 pexpire key2 100000 表示設置 key2 在 100000 毫秒(100 秒)后過期。
  • expireat <key> <n>:設置 key 在某個時間戳(精確到秒)之后過期,比如 expireat key3 1655654400 表示 key3 在時間戳 1655654400 后過期(精確到秒);
  • pexpireat <key> <n>:設置 key 在某個時間戳(精確到毫秒)之后過期,比如 pexpireat key4 1655654400000 表示 key4 在時間戳 1655654400000 后過期(精確到毫秒)

當然,在設置字符串時,也可以同時對 key 設置過期時間,共有 3 種命令:

  • set <key> <value> ex <n> :設置鍵值對的時候,同時指定過期時間(精確到秒);
  • set <key> <value> px <n> :設置鍵值對的時候,同時指定過期時間(精確到毫秒);
  • setex <key> <n> <valule>   :設置鍵值對的時候,同時指定過期時間(精確到秒)。

如果你想查看某個 key 剩余的存活時間,可以使用 TTL <key> 命令。

# 設置鍵值對的時候,同時指定過期時間位 60
> setex key1 60 value1
OK

# 查看 key1 過期時間還剩多少
> ttl key1
(integer) 56
> ttl key1
(integer) 52

如果突然反悔,取消 key 的過期時間,則可以使用 PERSIST <key> 命令。

# 取消 key1 的過期時間
> persist key1
(integer) 1

# 使用完 persist 命令之后,
# 查下 key1 的存活時間結果是 -1,表明 key1 永不過期
> ttl key1
(integer) -1

如何判定 key 已過期了?

每當我們對一個 key 設置了過期時間時,Redis  會把該 key 帶上過期時間存儲到一個過期字典(expires dict)中,也就是說「過期字典」保存了數據庫中所有 key 的過期時間。

過期字典存儲在 redisDb 結構中,如下:

typedef struct redisDb {
dict *dict; /* 數據庫鍵空間,存放著所有的鍵值對 */
dict *expires; /* 鍵的過期時間 */
....
} redisDb;

過期字典數據結構結構如下:

  • 過期字典的 key 是一個指針,指向某個鍵對象;
  • 過期字典的 value 是一個 long long 類型的整數,這個整數保存了 key 的過期時間;

過期字典的數據結構如下圖所示:

圖片

字典實際上是哈希表,哈希表的最大好處就是讓我們可以用 O(1) 的時間復雜度來快速查找。當我們查詢一個 key 時,Redis 首先檢查該 key 是否存在于過期字典中:

  • 如果不在,則正常讀取鍵值;
  • 如果存在,則會獲取該 key 的過期時間,然后與當前系統時間進行比對,如果比系統時間大,那就沒有過期,否則判定該 key 已過期。

過期鍵判斷流程如下圖所示:

圖片

過期刪除策略有哪些?

在說 Redis 過期刪除策略之前,先跟大家介紹下,常見的三種過期刪除策略:

  • 定時刪除;
  • 惰性刪除;
  • 定期刪除;

接下來,分別分析它們的優缺點。

定時刪除策略是怎么樣的?

定時刪除策略的做法是,在設置 key 的過期時間時,同時創建一個定時事件,當時間到達時,由事件處理器自動執行 key 的刪除操作。

定時刪除策略的優點:

  • 可以保證過期 key 會被盡快刪除,也就是內存可以被盡快地釋放。因此,定時刪除對內存是最友好的。

定時刪除策略的缺點:

  • 在過期 key 比較多的情況下,刪除過期 key 可能會占用相當一部分 CPU 時間,在內存不緊張但 CPU 時間緊張的情況下,將 CPU 時間用于刪除和當前任務無關的過期鍵上,無疑會對服務器的響應時間和吞吐量造成影響。所以,定時刪除策略對 CPU 不友好。

惰性刪除策略是怎么樣的?

惰性刪除策略的做法是,不主動刪除過期鍵,每次從數據庫訪問 key 時,都檢測 key 是否過期,如果過期則刪除該 key。

惰性刪除策略的優點:

  • 因為每次訪問時,才會檢查 key 是否過期,所以此策略只會使用很少的系統資源,因此,惰性刪除策略對 CPU 時間最友好。

惰性刪除策略的缺點:

  • 如果一個 key 已經過期,而這個 key 又仍然保留在數據庫中,那么只要這個過期 key 一直沒有被訪問,它所占用的內存就不會釋放,造成了一定的內存空間浪費。所以,惰性刪除策略對內存不友好。

定期刪除策略是怎么樣的?

定期刪除策略的做法是,每隔一段時間「隨機」從數據庫中取出一定數量的 key 進行檢查,并刪除其中的過期key。

定期刪除策略的優點:

  • 通過限制刪除操作執行的時長和頻率,來減少刪除操作對 CPU 的影響,同時也能刪除一部分過期的數據減少了過期鍵對空間的無效占用。

定期刪除策略的缺點:

  • 內存清理方面沒有定時刪除效果好,同時沒有惰性刪除使用的系統資源少。
  • 難以確定刪除操作執行的時長和頻率。如果執行的太頻繁,定期刪除策略變得和定時刪除策略一樣,對CPU不友好;如果執行的太少,那又和惰性刪除一樣了,過期 key 占用的內存不會及時得到釋放。

Redis 過期刪除策略是什么?

前面介紹了三種過期刪除策略,每一種都有優缺點,僅使用某一個策略都不能滿足實際需求。

所以, Redis 選擇「惰性刪除+定期刪除」這兩種策略配和使用,以求在合理使用 CPU 時間和避免內存浪費之間取得平衡。

Redis 是怎么實現惰性刪除的?

Redis 的惰性刪除策略由 db.c 文件中的 expireIfNeeded 函數實現,代碼如下:

int expireIfNeeded(redisDb *db, robj *key) {
// 判斷 key 是否過期
if (!keyIsExpired(db,key)) return 0;
....
/* 刪除過期鍵 */
....
// 如果 server.lazyfree_lazy_expire1 表示異步刪除,反之同步刪除;
return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) :
dbSyncDelete(db,key);
}

Redis 在訪問或者修改 key 之前,都會調用 expireIfNeeded 函數對其進行檢查,檢查 key 是否過期:

  • 如果過期,則刪除該 key,至于選擇異步刪除,還是選擇同步刪除,根據lazyfree_lazy_expire 參數配置決定(Redis 4.0版本開始提供參數),然后返回 null 給客服端;
  • 如果沒有過期,不做任何處理,然后返回正常的鍵值對給客戶端;

惰性刪除的流程圖如下:

圖片

Redis 是怎么實現定期刪除的?

再回憶一下,定期刪除策略的做法:每隔一段時間「隨機」從數據庫中取出一定數量的 key 進行檢查,并刪除其中的過期key。

1.這個間隔檢查的時間是多長呢?

在 Redis 中,默認每秒進行 10 次過期檢查一次數據庫,此配置可通過 Redis 的配置文件 redis.conf 進行配置,配置鍵為 hz 它的默認值是 hz 10。

特別強調下,每次檢查數據庫并不是遍歷過期字典中的所有 key,而是從數據庫中隨機抽取一定數量的 key 進行過期檢查。

2.隨機抽查的數量是多少呢?

我查了下源碼,定期刪除的實現在 expire.c 文件下的 activeExpireCycle 函數中,其中隨機抽查的數量由 ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 定義的,它是寫死在代碼中的,數值是 20。

也就是說,數據庫每輪抽查時,會隨機選擇 20 個 key 判斷是否過期。

接下來,詳細說說 Redis 的定時刪除的流程:

  1. 從過期字典中隨機抽取 20 個 key;
  2. 檢查這 20 個 key 是否過期,并刪除已過期的 key;
  3. 如果本輪檢查的已過期 key 的數量,超過 5 個(20/4),也就是「已過期 key 的數量」占比「隨機抽取 key 的數量」大于 25%,則繼續重復步驟 1;如果已過期的 key 比例小于 25%,則停止繼續刪除過期 key,然后等待下一輪再檢查。

可以看到,定時刪除是一個循環的流程。

那 Redis 為了保證定時刪除不會出現循環過度,導致線程卡死現象,為此增加了定時刪除循環流程的時間上限,默認不會超過 25ms。

針對定時刪除的流程,我寫了個偽代碼:

do {
//已過期的數量
expired = 0
//隨機抽取的數量
num = 20;
while (num--) {
//1. 從過期字典中隨機抽取 1 個 key
//2. 判斷該 key 是否過期,如果已過期則進行刪除,同時對 expired++
}

// 超過時間限制則退出
if (timelimit_exit) return;

/* 如果本輪檢查的已過期 key 的數量,超過 25%,則繼續隨機抽查,否則退出本輪檢查 */
} while (expired > 20/4);

定時刪除的流程如下:

圖片

內存淘汰策略

前面說的過期刪除策略,是刪除已過期的 key,而當 Redis 的運行內存已經超過 Redis 設置的最大內存之后,則會使用內存淘汰策略刪除符合條件的 key,以此來保障 Redis 高效的運行。

如何設置 Redis 最大運行內存?

在配置文件 redis.conf 中,可以通過參數 maxmemory <bytes> 來設定最大運行內存,只有在 Redis 的運行內存達到了我們設置的最大運行內存,才會觸發內存淘汰策略。

不同位數的操作系統,maxmemory 的默認值是不同的:

  • 在 64 位操作系統中,maxmemory 的默認值是 0,表示沒有內存大小限制,那么不管用戶存放多少數據到 Redis 中,Redis 也不會對可用內存進行檢查,直到 Redis 實例因內存不足而崩潰也無作為。
  • 在 32 位操作系統中,maxmemory 的默認值是 3G,因為 32 位的機器最大只支持 4GB 的內存,而系統本身就需要一定的內存資源來支持運行,所以 32 位操作系統限制最大 3 GB 的可用內存是非常合理的,這樣可以避免因為內存不足而導致 Redis 實例崩潰。

Redis 內存淘汰策略有哪些?

Redis 內存淘汰策略共有八種,這八種策略大體分為「不進行數據淘汰」和「進行數據淘汰」兩類策略。

1.不進行數據淘汰的策略

noeviction(Redis3.0之后,默認的內存淘汰策略) :它表示當運行內存超過最大設置內存時,不淘汰任何數據,而是不再提供服務,直接返回錯誤。

2.進行數據淘汰的策略

針對「進行數據淘汰」這一類策略,又可以細分為「在設置了過期時間的數據中進行淘汰」和「在所有數據范圍內進行淘汰」這兩類策略。

在設置了過期時間的數據中進行淘汰:

  • volatile-random:隨機淘汰設置了過期時間的任意鍵值;
  • volatile-ttl:優先淘汰更早過期的鍵值。
  • volatile-lru(Redis3.0 之前,默認的內存淘汰策略):淘汰所有設置了過期時間的鍵值中,最久未使用的鍵值;
  • volatile-lfu(Redis 4.0 后新增的內存淘汰策略):淘汰所有設置了過期時間的鍵值中,最少使用的鍵值;

在所有數據范圍內進行淘汰:

  • allkeys-random:隨機淘汰任意鍵值;
  • allkeys-lru:淘汰整個鍵值中最久未使用的鍵值;
  • allkeys-lfu(Redis 4.0 后新增的內存淘汰策略):淘汰整個鍵值中最少使用的鍵值。

如何查看當前 Redis 使用的內存淘汰策略?

可以使用 config get maxmemory-policy 命令,來查看當前 Redis 的內存淘汰策略,命令如下:

127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"

可以看出,當前 Redis 使用的是 noeviction 類型的內存淘汰策略,它是 Redis 3.0 之后默認使用的內存淘汰策略,表示當運行內存超過最大設置內存時,不淘汰任何數據,但新增操作會報錯。

如何修改 Redis 內存淘汰策略?

設置內存淘汰策略有兩種方法:

  • 方式一:通過“config set maxmemory-policy <策略>”命令設置。它的優點是設置之后立即生效,不需要重啟 Redis 服務,缺點是重啟 Redis 之后,設置就會失效。
  • 方式二:通過修改 Redis 配置文件修改,設置“maxmemory-policy <策略>”,它的優點是重啟 Redis 服務后配置不會丟失,缺點是必須重啟 Redis 服務,設置才能生效。

LRU 算法和 LFU 算法有什么區別?

LFU 內存淘汰算法是 Redis  4.0 之后新增內存淘汰策略,那為什么要新增這個算法?那肯定是為了解決 LRU 算法的問題。

接下來,就看看這兩個算法有什么區別?Redis 又是如何實現這兩個算法的?

什么是 LRU 算法?

LRU 全稱是 Least Recently Used 翻譯為最近最少使用,會選擇淘汰最近最少使用的數據。

傳統 LRU 算法的實現是基于「鏈表」結構,鏈表中的元素按照操作順序從前往后排列,最新操作的鍵會被移動到表頭,當需要內存淘汰時,只需要刪除鏈表尾部的元素即可,因為鏈表尾部的元素就代表最久未被使用的元素。

Redis 并沒有使用這樣的方式實現 LRU 算法,因為傳統的 LRU 算法存在兩個問題:

  • 需要用鏈表管理所有的緩存數據,這會帶來額外的空間開銷;
  • 當有數據被訪問時,需要在鏈表上把該數據移動到頭端,如果有大量數據被訪問,就會帶來很多鏈表移動操作,會很耗時,進而會降低 Redis 緩存性能。

Redis 是如何實現 LRU 算法的?

Redis 實現的是一種近似 LRU 算法,目的是為了更好的節約內存,它的實現方式是在 Redis 的對象結構體中添加一個額外的字段,用于記錄此數據的最后一次訪問時間。

當 Redis 進行內存淘汰時,會使用隨機采樣的方式來淘汰數據,它是隨機取 5 個值(此值可配置),然后淘汰最久沒有使用的那個。

Redis 實現的 LRU 算法的優點:

  • 不用為所有的數據維護一個大鏈表,節省了空間占用;
  • 不用在每次數據訪問時都移動鏈表項,提升了緩存的性能;

但是 LRU 算法有一個問題,無法解決緩存污染問題,比如應用一次讀取了大量的數據,而這些數據只會被讀取這一次,那么這些數據會留存在 Redis 緩存中很長一段時間,造成緩存污染。

因此,在 Redis 4.0 之后引入了 LFU 算法來解決這個問題。

什么是 LFU 算法?

LFU 全稱是 Least Frequently Used 翻譯為最近最不常用的,LFU 算法是根據數據訪問次數來淘汰數據的,它的核心思想是“如果數據過去被訪問多次,那么將來被訪問的頻率也更高”。

所以, LFU 算法會記錄每個數據的訪問次數。當一個數據被再次訪問時,就會增加該數據的訪問次數。這樣就解決了偶爾被訪問一次之后,數據留存在緩存中很長一段時間的問題,相比于 LRU 算法也更合理一些。

Redis 是如何實現 LFU 算法的?

LFU 算法相比于  LRU 算法的實現,多記錄了「數據的訪問頻次」的信息。Redis 對象的結構如下:

typedef struct redisObject {
...

// 24 bits,用于記錄對象的訪問信息
unsigned lru:24;
...
} robj;

Redis 對象頭中的 lru 字段,在 LRU 算法下和 LFU 算法下使用方式并不相同。

在 LRU 算法中,Redis 對象頭的 24 bits 的 lru 字段是用來記錄 key 的訪問時間戳,因此在 LRU 模式下,Redis可以根據對象頭中的 lru 字段記錄的值,來比較最后一次 key 的訪問時間長,從而淘汰最久未被使用的 key。

在 LFU 算法中,Redis對象頭的 24 bits 的 lru 字段被分成兩段來存儲,高 16bit 存儲 ldt(Last Decrement Time),低 8bit 存儲 logc(Logistic Counter)。

圖片

  • ldt 是用來記錄 key 的訪問時間戳;
  • logc 是用來記錄 key 的訪問頻次,它的值越小表示使用頻率越低,越容易淘汰,每個新加入的 key 的logc 初始值為 5。

注意,logc 并不是單純的訪問次數,而是訪問頻次(訪問頻率),因為 logc  會隨時間推移而衰減的。

在每次 key 被訪問時,會先對 logc 做一個衰減操作,衰減的值跟前后訪問時間的差距有關系,如果上一次訪問的時間與這一次訪問的時間差距很大,那么衰減的值就越大,這樣實現的 LFU 算法是根據訪問頻率來淘汰數據的,而不只是訪問次數。訪問頻率需要考慮 key 的訪問是多長時間段內發生的。key 的先前訪問距離當前時間越長,那么這個 key 的訪問頻率相應地也就會降低,這樣被淘汰的概率也會更大。

對 logc 做完衰減操作后,就開始對 logc  進行增加操作,增加操作并不是單純直接 + 1,而是根據概率增加,如果 logc 越大的 key,它的 logc 就越難再增加。

所以,Redis 在訪問 key 時,對于 logc  是這樣變化的:

  1. 先按照上次訪問距離當前的時長,來對 logc 進行衰減;
  2. 然后,再按照一定概率增加 logc 的值

redis.conf 提供了兩個配置項,用于調整 LFU 算法從而控制 logc 的增長和衰減:

  • lfu-decay-time 用于調整 logc 的衰減速度,它是一個以分鐘為單位的數值,默認值為1,lfu-decay-time 值越大,衰減越慢;
  • lfu-log-factor 用于調整 logc 的增長速度,lfu-log-factor 值越大,logc 增長越慢。

總結

Redis 使用的過期刪除策略是「惰性刪除+定期刪除」,刪除的對象是已過期的 key。

圖片

內存淘汰策略是解決內存過大的問題,當 Redis 的運行內存超過最大運行內存時,就會觸發內存淘汰策略,Redis 4.0 之后共實現了 8 種內存淘汰策略,我也對這 8 種的策略進行分類,如下:

圖片

責任編輯:武曉燕 來源: 小林coding
相關推薦

2023-10-26 07:13:14

Redis內存淘汰

2021-09-10 18:47:22

Redis淘汰策略

2024-09-26 06:30:36

2020-07-17 21:15:08

Redis內存數據庫

2025-08-11 02:00:00

JWTSession系統

2024-10-08 10:13:17

2023-03-14 11:00:05

過期策略Redis

2019-11-22 09:36:00

Redis數據存儲

2019-11-21 14:22:12

WiFiWLAN區別

2023-10-16 23:57:35

Redis內存

2025-10-16 07:15:00

運維curlwget

2024-12-25 10:24:31

2019-04-10 10:43:15

Redis內存淘汰策略

2020-01-15 14:51:04

Redis5.0數據策略

2021-03-13 14:04:43

Redis內存策略

2024-04-18 00:20:56

Redis策略數據

2021-03-10 10:40:04

Redis命令Linux

2021-12-23 15:05:46

Redis內存Java

2024-08-19 09:13:02

2024-06-04 07:38:10

點贊
收藏

51CTO技術棧公眾號

国产精品欧美经典| 韩国精品在线观看| 亚洲色图偷窥自拍| 日本超碰在线观看| 国产三级伦理在线| 久久久精品国产免费观看同学| 国产成人精品a视频一区www| 人人干在线观看| 看全色黄大色大片免费久久久| 色呦呦国产精品| 91视频成人免费| 青梅竹马是消防员在线| 精品一区二区三区视频在线观看 | 欧美一级片在线免费观看| 国产一二三在线| 最新中文字幕一区二区三区| 极品校花啪啪激情久久| 国产精品久久久久久久久毛片| 亚洲国产影院| 久久影院免费观看| 亚洲色成人网站www永久四虎| 欧美久久亚洲| 欧美午夜电影在线播放| 欧美激情 国产精品| 黄网站免费在线观看| 久久日韩精品一区二区五区| 91精品黄色| 一二三区在线播放| 快she精品国产999| 午夜精品久久久久久久久久久久久 | 一级特黄录像免费看| 亚洲尤物精选| 久久久久久久激情视频| 精品无码久久久久成人漫画| 久久97视频| 精品亚洲精品福利线在观看| 18禁一区二区三区| 久久中文字幕一区二区| 欧美日韩国产经典色站一区二区三区 | 毛片在线不卡| 中文欧美字幕免费| 欧洲国产精品| 韩日视频在线| 久久久久久久综合日本| 精品一区二区三区日本| 日批视频在线播放| 国产老女人精品毛片久久| 国产在线精品成人一区二区三区| 亚洲欧美一二三区| 久久久夜夜夜| 国产v综合ⅴ日韩v欧美大片| 日韩三级av在线| 99av国产精品欲麻豆| 欧美精品久久久久| 国产精品成人av久久| 亚洲第一精品影视| 97精品一区二区三区| 中文字幕一区二区三区手机版| 欧美日韩亚洲一区三区| 久久久国产一区| 国产尤物在线播放| 欧美国产精品| 久久全国免费视频| 久久一区二区三区视频| 激情久久五月| 日本亚洲欧洲色α| 中日韩av在线| 国产在线不卡视频| 国产66精品久久久久999小说| 亚洲国产成人在线观看| 成人av免费在线播放| 精品国产一区二区三区四区vr| 天天干在线观看| 久久久99久久| 亚洲第一导航| h视频在线免费观看| 亚洲图片一区二区| 欧美精品第三页| 日韩国产一二三区| 精品久久免费看| 无码人妻精品一区二区三区温州| 一区二区三区日本久久久| 国产香蕉97碰碰久久人人| 特黄一区二区三区| 亚洲午夜黄色| 国产精品老牛影院在线观看| 国产乱淫av片免费| 99国产欧美久久久精品| 亚洲国产一区二区精品视频| 成人片在线看| 欧美香蕉大胸在线视频观看| 日韩肉感妇bbwbbwbbw| 中文字幕日韩高清在线| 国产丝袜一区视频在线观看| 免费黄色国产视频| 日韩视频精品在线观看| 国产精品视频中文字幕91| 北条麻妃一二三区| 国产欧美精品一区二区色综合朱莉| 综合网五月天| 电影网一区二区| 日韩欧美中文字幕一区| 性少妇bbw张开| 欧美日韩天堂| 国产人妖伪娘一区91| 日本黄色不卡视频| 亚洲视频1区2区| 日韩精品一区二区三区不卡 | 欧美人与禽性xxxxx杂性| 欧美性猛交xxxx富婆弯腰| 丰满人妻一区二区三区53视频| 久久av影视| 欧美激情视频网址| 97精品人妻一区二区三区在线| www.欧美亚洲| 国产精品无码电影在线观看| 成人在线免费| 亚洲欧洲日韩国产| 久久久久亚洲av无码专区| 免费在线看成人av| 欧美一区观看| 色资源二区在线视频| 精品国产欧美一区二区| 国产人妻精品一区二区三区不卡| 鲁大师成人一区二区三区| 国产精品 日韩| 国产福利在线播放麻豆| 欧美日韩精品一区视频| 精品无码国产污污污免费网站 | 天堂av8在线| av伊人久久| 国产精品678| 免费在线黄色网址| 欧美日韩精品在线视频| 亚洲欧美日韩色| 国内一区二区三区| 97欧洲一区二区精品免费| 日韩毛片久久久| 欧美三级视频在线观看| 在线观看国产精品一区| 亚洲永久在线| 日本高清一区| 高清成人在线| 在线观看精品国产视频| 人人妻人人爽人人澡人人精品| 91麻豆精品在线观看| 日韩av片在线看| 老牛国内精品亚洲成av人片| 韩国欧美亚洲国产| 天天干免费视频| 精品国产乱码久久久久酒店 | 国产精品久久久久久久久图文区| 无码日韩人妻精品久久蜜桃| 国产不卡一二三区| 国产精品久久久久久久久久 | 欧美日韩一区二区三区在线电影| 欧美国产精品va在线观看| 精品人妻午夜一区二区三区四区| 亚洲三级理论片| 好吊操视频这里只有精品| 在线日韩中文| 蜜桃日韩视频| 黑人一区二区三区| 久久夜色精品国产| 性做久久久久久久久久| 午夜精品福利在线| 日本xxxxxxxxx18| 蜜臀av一区二区| 中文字幕一区二区三区四区五区人| 成人av在线播放| 久久久久亚洲精品成人网小说| 人妻中文字幕一区| 日本乱人伦aⅴ精品| 精品一区二区三孕妇视频| 国产精品91一区二区| 阿v天堂2018| 精品久久美女| 2022国产精品| 日韩电影av| 久久婷婷国产麻豆91天堂| 欧美一级做性受免费大片免费 | 91在线精品入口| 亚洲综合视频在线| b站大片免费直播| 韩国欧美国产1区| av动漫在线看| 91影院成人| 国产精品xxx在线观看www| 欧美xoxoxo| 欧美巨大黑人极品精男| 日本人妖在线| 欧美一区在线视频| 日韩三级一区二区| 亚洲精品免费在线播放| 中文字幕在线1| 国v精品久久久网| 亚洲不卡视频在线| 好吊日精品视频| 亚洲欧洲一区二区在线观看| 136福利精品导航| 国产欧亚日韩视频| 巨茎人妖videos另类| 久久91超碰青草是什么| 黄色片在线播放| 亚洲精品在线三区| 一二三区在线播放| 色成年激情久久综合| 免费一级片在线观看| 中文字幕不卡在线观看| 一区二区免费在线观看视频| 久久国产福利国产秒拍| 日本精品一区在线观看| 欧美日韩岛国| 欧美另类网站| 国偷自产视频一区二区久| 国产精品一区久久久| 少妇在线看www| 欧美黄网免费在线观看| 免费av在线播放| 亚洲天堂网站在线观看视频| 日本免费一区视频| 日韩亚洲欧美在线观看| 中文字字幕在线中文乱码| 日韩欧美在线免费| 久久高清免费视频| 亚洲宅男天堂在线观看无病毒| 99久久精品久久亚洲精品| 久久精品视频在线看| 国产又黄又粗又猛又爽的视频 | 国产农村妇女精品一区二区| 青青草免费在线视频观看| 三级电影一区| 亚洲 日韩 国产第一区| 色综合综合色| 免费看成人片| 图片婷婷一区| 麻豆av一区| 外国成人在线视频| 欧美日本韩国一区二区三区| 欧美日韩另类图片| 国精产品一区二区| 午夜a一级毛片亚洲欧洲| 国产精品制服诱惑| 久久夜色电影| 精品国产一区二区三区麻豆免费观看完整版 | 日本免费观看视| 午夜精品久久久久久不卡8050| 国产一级理论片| 婷婷夜色潮精品综合在线| 日本午夜精品理论片a级app发布| 亚洲综合激情另类小说区| 成人动态视频| 国产亚洲xxx| 国产综合在线观看| 亚洲视频在线免费看| 国际av在线| 日韩中文字幕免费看| 免费a级在线播放| 欧美精品免费在线| 成人福利电影| 欧美性视频网站| 日本电影欧美片| 国产这里只有精品| 日韩视频一区二区三区四区| av噜噜色噜噜久久| 农村少妇一区二区三区四区五区 | 欧美性生活一级片| 欧洲亚洲一区二区三区四区五区| 深夜福利久久| 尤物一区二区三区| 国产精品www.| 国产免费一区二区三区视频| 日韩av在线播放中文字幕| www.国产视频.com| 成人精品在线视频观看| 深爱五月激情网| 椎名由奈av一区二区三区| 精品97人妻无码中文永久在线| 午夜欧美在线一二页| 日韩电影在线观看一区二区| 欧美三级在线播放| 黑人精品一区二区三区| 亚洲人成在线观看网站高清| 欧美被日视频| 91精品国产九九九久久久亚洲| 午夜精品久久久久久久久久蜜桃| 成人疯狂猛交xxx| 久久精品国产亚洲blacked| 日韩精品电影网站| 欧美精品观看| 久久婷婷国产91天堂综合精品| 国产老妇另类xxxxx| 国产在线观看h| 亚洲综合色婷婷| 亚洲av无码乱码国产精品fc2| 91精品国产全国免费观看| 天堂а在线中文在线无限看推荐| 亚洲午夜av电影| 国产探花视频在线观看| 国产精品久久久久久久一区探花| 日韩高清一区| 午夜精品短视频| 日韩视频二区| 精产国品一区二区三区| 中文字幕第一区第二区| 日韩成年人视频| 制服丝袜亚洲播放| 黄色软件在线| 91精品国产91久久久久久| 99视频这里有精品| 视频一区不卡| 亚洲一区日韩在线| 中国极品少妇xxxx| 亚洲男女一区二区三区| 成人黄色免费网| 精品偷拍一区二区三区在线看| av黄在线观看| 国产一区私人高清影院| 欧美激情在线免费| 国产免费黄色小视频| 国产suv精品一区二区6| frxxee中国xxx麻豆hd| 色成年激情久久综合| 天堂中文在线8| 97精品国产97久久久久久春色| 国产一区二区三区免费观看在线| 天天好比中文综合网| 久久亚洲精品伦理| 免费观看av网站| 精品日本高清在线播放| 欧美一区二区三区成人片在线| 久久亚洲精品小早川怜子66| 成人精品一区二区三区电影| 清纯唯美一区二区三区| 亚洲欧美日韩视频二区| 国产精品无码一区二区三区免费| 亚洲成人tv网| 日韩性xxxx| 97婷婷涩涩精品一区| 国产一区调教| 成熟丰满熟妇高潮xxxxx视频| 国产91对白在线观看九色| 国产亚洲第一页| 亚洲成人动漫在线播放| а√天堂中文资源在线bt| 国产一区二区三区色淫影院| 亚洲精品日韩久久| 成人免费无码大片a毛片| 岛国av一区二区| 欧美孕妇孕交xxⅹ孕妇交| 国产mv免费观看入口亚洲| 久久99蜜桃| 五月婷婷之综合激情| 国产精品色噜噜| 国产精品久久久久久久久久久久久久久久久久 | 黄色一级片在线免费观看| 日韩精品资源二区在线| xxx.xxx欧美| 久久一区二区精品| 丝袜a∨在线一区二区三区不卡| 真实乱视频国产免费观看| 欧美日韩一本到| av网址在线| 国内精品国语自产拍在线观看| 国产日韩欧美一区| 免费一级黄色录像| 91精品国产欧美一区二区| 蜜臀av在线| 欧美成熟毛茸茸复古| 免费观看久久久4p| 手机在线免费看片| 欧美精品一区二区精品网| 亚洲精品福利电影| 亚洲一二三区精品| 国产91丝袜在线观看| 黄色片中文字幕| www.午夜精品| 国产一区丝袜| gai在线观看免费高清| 亚洲一二三四区不卡| 国产乱理伦片a级在线观看| 91久久久久久久久久久久久| 韩日成人av| 少妇视频在线播放| 日韩精品一区二区三区三区免费| 女人让男人操自己视频在线观看 | 亚洲激情黄色| 免费看91的网站| 日韩欧美精品在线视频| 欧美黑人疯狂性受xxxxx野外| 中文字幕一区二区三区乱码 | 欧美极品色图| 极品少妇一区二区三区精品视频| 国产无码精品一区二区| 伊人久久久久久久久久| 少妇精品在线| 能看的毛片网站| 五月激情综合网| 国内外激情在线| 欧美日韩国产精品一卡|