国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

深入理解Redis內(nèi)存回收和內(nèi)存淘汰機(jī)制

 更新時(shí)間:2024年06月19日 09:56:44   作者:lcn29  
Redis使用多種過期策略和內(nèi)存淘汰機(jī)制來管理內(nèi)存,本文主要介紹了深入理解Redis內(nèi)存回收和內(nèi)存淘汰機(jī)制, 具有一定的參考價(jià)值,感興趣的可以了解一下

1 概念

Redis 所有的數(shù)據(jù)都是存儲(chǔ)在內(nèi)存中的, 如果不進(jìn)行任何的內(nèi)存回收, 那么很容易出現(xiàn)內(nèi)存爆滿的情況。因此,在某些情況下需要對(duì)占用的內(nèi)存空間進(jìn)行釋放。

Redis 中內(nèi)存的釋放主要分為兩類
Redis 中內(nèi)存的釋放主要分為兩類:

內(nèi)存回收: 將過期的 key 清除,以減少內(nèi)存占用

內(nèi)存淘汰: 在內(nèi)存使用達(dá)到上限(max_memory), 按照一定的策略刪除一些鍵,以釋放內(nèi)存空間

兩者都是通過刪除 key (及其對(duì)應(yīng)的 value) 來達(dá)到釋放空間的效果。
區(qū)別在于前者清除的是用戶明確不需要的 key, 而后者清除的則是用戶可能仍然需要的 key。

2 內(nèi)存回收

2.1 過期策略

在內(nèi)存中的大量 key 中, 如何清除其中已經(jīng)過期的 key 呢?

常用的方式有 3 種

  • 定時(shí)過期
  • 惰性過期
  • 定期過期

定時(shí)過期

為每個(gè) key 都創(chuàng)建一個(gè)定時(shí)器, 時(shí)間到了, 就將這個(gè) key 清除。
該策略可以立即清除過期的數(shù)據(jù), 對(duì)內(nèi)存很友好。但是會(huì)占用大量的 CPU 資源去處理過期的數(shù)據(jù), 從而影響緩存的響應(yīng)時(shí)間和吞吐量。

惰性過期

key 過期了, 不進(jìn)行處理。當(dāng)后續(xù)訪問到這個(gè) key 時(shí), 才會(huì)判斷該 key 是否已過期, 過期則清除。
該策略可以最大化地節(jié)省 CPU 資源, 卻對(duì)內(nèi)存非常不友好。極端情況可能出現(xiàn)大量的過期 key 沒有再次被訪問, 從而不會(huì)被清除, 占用大量?jī)?nèi)存。

定期過期

將所有的 key 維護(hù)在一起, 每隔一段時(shí)間就從中掃描一定的數(shù)量的 key(采樣), 并清除其中已經(jīng)過期的 key。
通過調(diào)整定時(shí)掃描的時(shí)間間隔和每次掃描的耗時(shí), 可以在不同情況下使得 CPU 和內(nèi)存資源達(dá)到最優(yōu)的平衡效果。

在 Reids 的實(shí)現(xiàn)中是通過 惰性過期 + 定期過期 2 種策略配合, 達(dá)到內(nèi)存回收的效果。

2.2 惰性過期 在 Redis 中的實(shí)現(xiàn)

前提: Redis 中一個(gè)對(duì)象的過期時(shí)間存放在 dictEntry 的 v.s64 中, 至于 dictEntry 的設(shè)計(jì)可以看一下后面的附錄

Redis 大部分讀寫對(duì)象的命令, 在執(zhí)行前都會(huì)調(diào)用 expireIfNeeded 函數(shù)做一個(gè)過期檢查

  • 如果 key 已經(jīng)過期了, 將其刪除
  • 如果 key 未過期, 不做任何處理

expireIfNeeded 函數(shù)的定義如下

int expireIfNeeded(redisDb *db, robj *key) {

    // key 未過期返回 0
    if (!keyIsExpired(db,key)) return 0;

    // 下面的邏輯都是 Key 過期的邏輯處理

    // 當(dāng)前的節(jié)點(diǎn)是從節(jié)點(diǎn), 返回 1, 然后結(jié)束
    // 為了保持主從數(shù)據(jù)的一致, 從節(jié)點(diǎn)不會(huì)主動(dòng)清除數(shù)據(jù), 都是主節(jié)點(diǎn)同步消息在刪除
    if (server.masterhost != NULL) return 1;

    // 已經(jīng)刪除過期鍵個(gè)數(shù) + 1
    server.stat_expiredkeys++;
    // 向從節(jié)點(diǎn)和 AOF 文件傳播 key 過期信息, 清除過期 key
    propagateExpire(db,key,server.lazyfree_lazy_expire);
    // 發(fā)送事件通知
    notifyKeyspaceEvent(NOTIFY_EXPIRED,"expired",key,db->id);

    // lazyfree-lazy-expire 配置參數(shù) (版本 4.0 以上支持), 默認(rèn)為 0
    // 根據(jù)配置, 同步或異步刪除 key (異步刪除: 先將 key 邏輯刪除, 然后在通過后臺(tái)的線程池進(jìn)行真正的空間釋放)
    return server.lazyfree_lazy_expire ? dbAsyncDelete(db,key) : dbSyncDelete(db,key);
}

int keyIsExpired(redisDb *db, robj *key) {
    // 從過期字典中獲取 key 對(duì)應(yīng)的過期時(shí)間, 實(shí)際就是獲取 dictEntity 的 v 中的 s64 值 (dictEntity.v.s64)
    mstime_t when = getExpire(db,key);
    mstime_t now;

    // 沒有過期時(shí)間
    if (when < 0) return 0;

    // redis 在加載數(shù)據(jù)中
    if (server.loading) return 0;
    
    // 獲取當(dāng)前的事件
    if (server.lua_caller) {
        // 有 lua 腳本在執(zhí)行中, 當(dāng)前時(shí)間等于腳本開始執(zhí)行前的時(shí)間
        now = server.lua_time_start;
    } else if (server.fixed_time_expire > 0) {
        // 有緩存時(shí)間, 線使用緩存時(shí)間
        // server.mstime 這個(gè)時(shí)間會(huì)在調(diào)用執(zhí)行命令函數(shù)的 call() 前進(jìn)行更新
        // 這樣可以避免一些批量操作的命令, 比如 RPOPLPUSH 等命令, 這些命令會(huì)執(zhí)行過程中可能多次訪問這個(gè) key
        // 而在多次的訪問過程中, 可能出現(xiàn)上一次訪問未過期, 下次訪問已經(jīng)過期了, 通過這個(gè)緩沖時(shí)間可以解決這個(gè)問題
        now = server.mstime;
    } else {
        // 其他情況, 直接獲取當(dāng)前時(shí)間
        now = mstime();
    }

    // 當(dāng)前時(shí)間是否大于 key 的過期時(shí)間
    return now > when;
}

expireIfNeeded 的調(diào)用時(shí)機(jī), 基本都是在各個(gè)命令內(nèi)部。 以 String 的 get 命令為例, 大體的流程如下

/**
 * get 命令對(duì)應(yīng)的執(zhí)行函數(shù)
 * 需要的參數(shù)都封裝在 client 對(duì)象中
 */
void getCommand(client *c) {

    // getGenericCommand -> lookupKeyReadOrReply -> lookupKeyRead -> lookupKeyReadWithFlags
    // getGenericCommand 經(jīng)過幾個(gè)函數(shù)最終調(diào)用到 lookupKeyReadWithFlags
    getGenericCommand(c);
}

robj *lookupKeyReadWithFlags(redisDb *db, robj *key, int flags) {

    robj *val;
    // expireIfNeeded 返回 > 0, 過期了
    if (expireIfNeeded(db,key) == 1) {
        // 省略過期處理
        // 過期的處理, 然后 return null
    }

    // 非過期處理, 查找然后返回
    val = lookupKey(db,key,flags);
    if (val == NULL)
        server.stat_keyspace_misses++;
    else
        server.stat_keyspace_hits++;
    return val;
}

上面就是 get 指令的中的惰性過期的過程, 其他命令的邏輯差不多, 核心就是一個(gè) expireIfNeeded 函數(shù)。

2.3 定期過期在 Redis 中的實(shí)現(xiàn)

Redis 默認(rèn)是 16 個(gè)數(shù)據(jù)庫(kù), 每個(gè)數(shù)據(jù)庫(kù)會(huì)將設(shè)置了過期時(shí)間的 key 放到各自的一個(gè)獨(dú)立的字典中, 稱為過期字典 (redisDb 對(duì)象的 dict *expires 屬性)。

然后 Redis 默認(rèn)會(huì)按照每秒 10 次的頻率(可以通過 redis.conf 中的 hz 配置)進(jìn)行過期掃描。
掃描的過程不會(huì)遍歷整個(gè)過期字典,而是按照以下策略進(jìn)行

  • 從過期字典中隨機(jī)選擇 20 個(gè) key
  • 刪除其中已經(jīng)過期的鍵
  • 如果超過 25% 的鍵被刪除, 則重復(fù)步驟 1, 2, 3, 沒有超過, 就結(jié)束這次掃描
  • 同時(shí)為防止重復(fù)循環(huán), 導(dǎo)致線程卡死, 增加了每 16 次抽樣, 就做一次掃描時(shí)間的上限的檢查 (默認(rèn)是慢模式下, 上限是 25 毫秒, 如果是快模式,掃描上限是 1 毫秒), 超過就結(jié)束循環(huán)

定期過期刪除的實(shí)現(xiàn)主要在 /activeExpireCycle 函數(shù), 大體的邏輯如下

/**
 * 過期循環(huán)清除
 * 為了便于理解, 這里對(duì)函數(shù)的邏輯做了一點(diǎn)小調(diào)整和刪除一些非必要的邏輯, 但是整體的邏輯不變

 * @type 模式, 取值有 2 個(gè) ACTIVE_EXPIRE_CYCLE_SLOW (0, 慢模式), ACTIVE_EXPIRE_CYCLE_FAST (1, 快模式)
 */
void activeExpireCycle(int type) {

    // 靜態(tài)變量, 當(dāng)前處理的數(shù)據(jù)庫(kù)索引
    // 靜態(tài)的效果, 這個(gè)變量執(zhí)行后的值不會(huì)被清空, 每次調(diào)用這個(gè)方法, 是上一次執(zhí)行的值
    // 這樣就可以保證 16 個(gè)數(shù)據(jù)庫(kù), 每次方法執(zhí)行完, 下次進(jìn)來可以執(zhí)行到下一個(gè)數(shù)據(jù)庫(kù), 循環(huán)起來,而不是每次進(jìn)來都從第 0 個(gè)開始
    static unsigned int current_db = 0;

    // 上一次清理是否是因?yàn)闀r(shí)間超時(shí)結(jié)束循環(huán)的, 同樣是靜態(tài)變量
    static int timelimit_exit = 0;    
    // 上一次快速循環(huán)循環(huán)的時(shí)間, 同樣是靜態(tài)變量
    static long long last_fast_cycle = 0;

    // 當(dāng)前時(shí)間
    long long start = ustime(),

    // 本次循環(huán)清除是快速循環(huán), 上一次是時(shí)間超時(shí)獲取 2 次快速循環(huán)的時(shí)間差在 2 毫秒內(nèi), 不執(zhí)行
    if (type == ACTIVE_EXPIRE_CYCLE_FAST) {
        // 上一次循環(huán)是因?yàn)闀r(shí)間超時(shí)結(jié)束的, 本次快速循環(huán)不進(jìn)行
        if (!timelimit_exit) return;
        // 上次快速循環(huán)距離當(dāng)前時(shí)間在 1000 * 2 = 2 毫秒內(nèi), 也不進(jìn)行快速循環(huán)
        if (start < last_fast_cycle + ACTIVE_EXPIRE_CYCLE_FAST_DURATION*2) return;
        last_fast_cycle = start;
    }

    // 計(jì)算循環(huán)的上限毫秒限制 
    // server.hz 默認(rèn)等于 10, ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 等于 25
    // 1000000 * 25 / 10 / 100 = 25000 單位: 微秒, 即 25 毫秒
    long long timelimit = 1000000*ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC/server.hz/100;

    // ACTIVE_EXPIRE_CYCLE_FAST_DURATION = 1000
    // 如果是快模式, 修改為 1000 微秒, 即 1 毫秒超時(shí)
    if (type == ACTIVE_EXPIRE_CYCLE_FAST)
        timelimit = ACTIVE_EXPIRE_CYCLE_FAST_DURATION;


    // CRON_DBS_PER_CALL = 16, 每次循環(huán)處理的數(shù)據(jù)庫(kù)數(shù)量
    int dbs_per_call = CRON_DBS_PER_CALL;

    // 遍歷當(dāng)前數(shù)據(jù)庫(kù)的次數(shù)
    int iteration = 0;

    // 遍歷循環(huán) 16 個(gè)數(shù)據(jù)庫(kù)
    for (int j = 0; j < dbs_per_call && timelimit_exit == 0; j++) {

        // 清理過期的 key 個(gè)數(shù)
        int expired;

        // 計(jì)算本次處理的數(shù)據(jù)庫(kù)
        redisDb *db = server.db+(current_db % server.dbnum);
        current_db++;

        do {
            // 開始循環(huán)清除當(dāng)前數(shù)據(jù)庫(kù)中過期的 key

            // 遍歷次數(shù) + 1
            iteration++;

            // dictSize 獲取整個(gè)過期字典的已經(jīng)使用大小
            unsigned long num = dictSize(db->expires);

            // num == 0 表示整個(gè)字典沒有數(shù)據(jù), 跳出循環(huán),處理下一個(gè)數(shù)據(jù)庫(kù)
            if (num == 0) {
                break;
            }

            // 計(jì)算整個(gè)過期字典的總大小
            unsigned long slots = dictSlots(db->expires);

            // DICT_HT_INITIAL_SIZE = 4, 每個(gè)字典初始化時(shí)的默認(rèn)值
            // num > 0, 字典中有數(shù)據(jù)了, slots 大于 4, 表示當(dāng)前的字典擴(kuò)容過了
            // num && slots > DICT_HT_INITIAL_SIZE, 當(dāng)前的字典擴(kuò)容過同時(shí)里面有數(shù)據(jù)
            // num * 100 / slots < 1 計(jì)算當(dāng)前使用的數(shù)據(jù)占整個(gè)字典的百分比是否小于 1%

            // Redis 認(rèn)為, 如果一個(gè)字典中的使用率小于 1%, 花時(shí)間去進(jìn)行清理是一個(gè)昂貴的操作
            // 應(yīng)該停下來,等待更好的時(shí)間再進(jìn)行調(diào)整
            // 所以簡(jiǎn)單理解: 當(dāng)這個(gè)字典中使用的空間小于 1%, 這里跳過了這個(gè)數(shù)據(jù)的處理
            if (num && slots > DICT_HT_INITIAL_SIZE && (num * 100 / slots < 1)) 
                break;

            expired = 0;

            // ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP = 20 
            // 本次從過期字典中獲取多少個(gè) key, 如果字典中的已經(jīng)使用的 key 大于 20, 則只取 20 個(gè), 否則有多少取多少
            if (num > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP)
                num = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP;
            
            // 循環(huán) num 次從字典中獲取 key 
            while (num--) {

                dictEntry *de;
                // 從過期字典中隨機(jī)獲取一個(gè) key, 獲取不到, 就停止本次循環(huán)
                if ((de = dictGetRandomKey(db->expires)) == NULL) break;

                // 嘗試釋放這個(gè) key, 如果 key 釋放成功, 過期次數(shù) + 1
                if (activeExpireCycleTryExpire(db,de,now)) expired++;

            }

            // 0xf = 15, iteration 表示遍歷了 15 次
            if ((iteration & 0xf) == 0) {
                // 計(jì)算消耗時(shí)間
                int elapsed = ustime()-start;
                // 消耗時(shí)間超過了限制時(shí)間, 結(jié)束本次循環(huán)
                if (elapsed > timelimit) {
                    // 超過時(shí)間限制標(biāo)識(shí)設(shè)置為 true, 本次循環(huán)清除超時(shí)了, 結(jié)束本次循環(huán)清除
                    timelimit_exit = 1;
                    break;
                }
            }

            // 本次清理的過期 key 超過了 25%, 繼續(xù), 否則結(jié)束
            // ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP = 20
            // 每次抽取的個(gè)數(shù)最大為 20 個(gè), 控制 25%, 20 * 25% = 5 個(gè)
            // 也就是過期的個(gè)數(shù)大于 5 就是大于 25%, (ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP/4 = 5)
        } while (expired > ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP/4);
    }

    // 省略各種分析數(shù)據(jù)的記錄
}

調(diào)用 activeExpireCycle 的入口有 2 個(gè)

  • Redis 定時(shí)事件觸發(fā)
/**
 * Reids 啟動(dòng)時(shí), 向事件輪詢中注冊(cè)的唯一一個(gè)定時(shí)事件(默認(rèn) 100 毫秒執(zhí)行一次), 執(zhí)行的函數(shù)
 */
int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
    ...
    // 數(shù)據(jù)庫(kù)掃描
    databasesCron();
    ...
}

void databasesCron(void) {

    // 過期功能開啟中, 默認(rèn)為開啟
    if (server.active_expire_enabled) {
        // 主節(jié)點(diǎn)
        if (server.masterhost == NULL) {
            // 慢模式循環(huán)清除
            activeExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW);
        } else {
            // 從節(jié)點(diǎn)處理
            expireSlaveKeys();
        }
    }

    ...
}
  • 事件輪詢中, 進(jìn)入阻塞前的調(diào)用函數(shù)
void beforeSleep(struct aeEventLoop *eventLoop) {

    ...

    // 過期功能開啟中同時(shí)為主節(jié)點(diǎn)
    if (server.active_expire_enabled && server.masterhost == NULL)
        // 快模式循環(huán)清除
        activeExpireCycle(ACTIVE_EXPIRE_CYCLE_FAST);

    ...
}

3 內(nèi)存淘汰

3.1 淘汰算法

為了能夠騰出內(nèi)存空間, 需要在一大群對(duì)象中選擇某一些進(jìn)行淘汰, 哪么應(yīng)該基于什么標(biāo)準(zhǔn)進(jìn)行選擇呢?
比較常見的算法有 2 個(gè): LRU 和 LFU。

LRU (Least Recently Used): 最近最少使用算法, 根據(jù)數(shù)據(jù)的歷史訪問記錄進(jìn)行淘汰數(shù)據(jù),優(yōu)先移除最近最少使用的數(shù)據(jù)。
簡(jiǎn)單理解就是根據(jù)對(duì)象的訪問時(shí)間, 優(yōu)先淘汰訪問時(shí)間最早的對(duì)象。

LFU (Least Frequently Used): 最少頻率使用算法, 根據(jù)數(shù)據(jù)的訪問頻率頻率進(jìn)行淘汰數(shù)據(jù), 優(yōu)先移除最近使用頻率最少的數(shù)據(jù)。
簡(jiǎn)單理解就是根據(jù)對(duì)象的訪問次數(shù), 優(yōu)先淘汰訪問次數(shù)最少的對(duì)象。

3.2 Redis 內(nèi)存淘汰策略

在 LFU 和 LRU 的基礎(chǔ)上, Redis 提供了 8 種淘汰策略

策略說明
noeviction默認(rèn)策略, 不會(huì)刪除任何數(shù)據(jù), 但是拒絕所有寫入操作并返回客戶端錯(cuò)誤信息 (error)OOM command not allow when used memory。此時(shí) Redis 只響應(yīng)讀操作。
volatile-lruLeast Recently Used, 最近最少使用。在所有設(shè)置了 expire 的 key 中刪除最近最少使用的鍵值對(duì), 即距離上次訪問時(shí)間最久的。
allkeys-lruLeast Recently Used, 最近最少使用。在所有的 key 中刪除最近最少使用的鍵值對(duì), 即距離上次訪問時(shí)間最久的。
volatile-lfuLeast Frequently Used, 最不經(jīng)常使用。在所有設(shè)置了 expire 的 key 中刪除最不經(jīng)常使用的鍵值對(duì), 即訪問次數(shù)最少的。
allkeys-lfuLeast Frequently Used, 最不經(jīng)常使用。在所有的 key 中刪除最不經(jīng)常使用的鍵值對(duì), 即訪問次數(shù)最少的。
volatile-random在所有設(shè)置了 expire 的 key 中隨機(jī)選擇刪除
allkeys-random在所有的 key 中隨機(jī)選擇刪除。
volatile-ttlTime To Live, 存活時(shí)間。 在所有設(shè)置了 expire 的 key 中刪除 ttl 值最多的。

volatile-lru, volatile-random, volatile-ttl, 在沒有符合條件的 key 的情況下, 會(huì)按照 noeviction 的策略進(jìn)行處理。

3.3 Redis 對(duì)象淘汰判斷標(biāo)準(zhǔn)設(shè)計(jì)

在上面介紹的幾種策略可以知道, 要判斷一個(gè)對(duì)象是否可以被淘汰, 需要對(duì)象自身存放使用策略對(duì)應(yīng)的數(shù)據(jù), 以便于判斷
比如:

2 個(gè) lru 策略, 需要對(duì)象自身保存好上次訪問的時(shí)間

2 個(gè) lfu 策略, 需要對(duì)象自身保存好訪問次數(shù)

ttl 策略, 需要對(duì)象自身保存好過期時(shí)間

2 個(gè) random 策略, 不需要保存額外的數(shù)據(jù), 通過隨機(jī)一個(gè)數(shù), 根據(jù)這個(gè)數(shù)從字典中獲取數(shù)據(jù)即可

3.3.1 Redis 對(duì)象的設(shè)計(jì)

正常情況下, 當(dāng)我們向 Redis 中存入一對(duì)鍵值對(duì), 實(shí)際可以拆分為 2 個(gè)對(duì)象, 一個(gè) key, 一個(gè) value。
其中 key 可以明確為是一個(gè)字符串, 所以存入到 Redis 的鍵值對(duì)的 key 會(huì)被封裝為 sds 對(duì)象。
但是 value 可以類型可以很多, 為了行為的統(tǒng)一等, 需要對(duì) value 做一個(gè)封裝, 落實(shí)到源碼中就是一個(gè) redisObject 對(duì)象, 其定義如下

typedef struct redisObject {
    
    /** 
     * 標(biāo)識(shí)這個(gè)對(duì)象的數(shù)據(jù)類型, 常說的 String, Hash, List 等
     */
    unsigned type:4;

    /**
     * 可以理解為數(shù)據(jù)類型的具體實(shí)現(xiàn)類型
     * 比如數(shù)據(jù)類型為 List, 在具體的實(shí)現(xiàn)中可以是 ArrayList LinkedList 等
     */
    unsigned encoding:4;

    /** 
     * LRU_BITS = 24,
     * 一個(gè) 24 位的變量, 表示對(duì)象最后一次被程序訪問的時(shí)間或者訪問的次數(shù), 與內(nèi)存回收有關(guān)
     * 暫時(shí)知道有這個(gè)對(duì)象即可, 后面有分析
     */
    unsigned lru:LRU_BITS;

    /**
     * 被引用的次數(shù), 當(dāng) refcount 為 0 的時(shí)候, 表示該對(duì)象已經(jīng)不被任何對(duì)象引用, 則可以進(jìn)行垃圾回收了
     */
    int refcount;

    /**
     * 一個(gè)指針, 指向具體的數(shù)據(jù)
     */
    void *ptr;

} robj;

一個(gè)對(duì)象的 lru 和 lfu 計(jì)算后的值, 都是存放在這個(gè)對(duì)象的 lru 字段中的, 但是 lru 和 lfu 的計(jì)算方式是不一樣的。

3.3.2 lru 策略, 對(duì)象的訪問時(shí)間設(shè)計(jì)

3.3.2.1 全局時(shí)間 lruclock

在 Redis 的中維護(hù)了一個(gè)全局的變量 lruclock, 表示當(dāng)前時(shí)間的一個(gè)相對(duì)值。

/**
 * redisServer 可以看做整個(gè) Redis 運(yùn)行時(shí)的上下文, 保存的數(shù)據(jù), 配置等都在這個(gè)結(jié)構(gòu)體中
 */
struct redisServer {
    unsigned int lruclock = getLRUClock();
}

unsigned int getLRUClock(void) {
    // LRU_CLOCK_RESOLUTION = 1000
    // mstime() 當(dāng)前時(shí)間毫秒, 當(dāng)前時(shí)間的毫秒/LRU_CLOCK_RESOLUTION = 當(dāng)前時(shí)間的毫秒/1000 = 變?yōu)閱挝幻?
    // LRU_CLOCK_MAX = ((1<<LRU_BITS)-1) = 1<<24-1 = redisObject lru 字段的最大值
    // (當(dāng)前的時(shí)間 / 1000) & (1<<24-1) 確保時(shí)間的精度是秒, 同時(shí)不會(huì)超過 24 位的整數(shù)的最多值
    // 整個(gè)全局時(shí)間的進(jìn)度為秒, 2 個(gè)對(duì)象的訪問時(shí)間差如果在秒內(nèi), 得到的是他們的訪問時(shí)間是一樣的
    
    // 得到一個(gè)當(dāng)前時(shí)間的相對(duì)值
    return (mstime()/LRU_CLOCK_RESOLUTION) & LRU_CLOCK_MAX;
}

同時(shí)這個(gè)時(shí)間會(huì)在 Redis 的定時(shí)任務(wù) serverCron 中定時(shí)的更新為最新的值

int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
    // serverCron 默認(rèn)是 100 毫秒執(zhí)行一次
    unsigned int lruclock = getLRUClock();
    atomicSet(server.lruclock,lruclock);
}

3.3.2.2 對(duì)象的訪問時(shí)間設(shè)計(jì)

Redis 每次通過 key 在數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的 value 時(shí), 在找到時(shí), 就會(huì)進(jìn)行 lru 字段的更新

robj *lookupKey(redisDb *db, robj *key, int flags) {
    // 從字典中獲取 key 對(duì)應(yīng)的 dictEntry (字典的設(shè)計(jì)可以看一下后面的附錄)
    dictEntry *de = dictFind(db->dict,key->ptr);
    if (de) {
        // 獲取 key 對(duì)應(yīng)的 dictEntry 的存在
        // 獲取 dictEntry 的 value 也就是 redisObject 對(duì)象
        robj *val = dictGetVal(de);

        if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && !(flags & LOOKUP_NOTOUCH)) {
            // 沒有在進(jìn)行 RDB 或 AOF 操作, 并且 flags 沒有設(shè)置 LOOKUP_NOTOUCH

            // 淘汰策略設(shè)置的的 LFU 策略
            if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
                updateLFU(val);
            } else {
                // 其他策略, 更新 lru 為全局的 lruclock
                val->lru = LRU_CLOCK();
            }
        }
    } else {
        // key 不存在, 返回 null
        return NULL;
    }
}

unsigned int LRU_CLOCK(void) {
    unsigned int lruclock;
    // LRU_CLOCK_RESOLUTION = 1000
    // 1000/server.hz 就是上面定時(shí)任務(wù) serverCron 的執(zhí)行時(shí)間
    // <= 1000 說明 serverCron 的執(zhí)行時(shí)間小于 1 秒, 直接獲取 server.lruclock 的值
    // 如果大于 1000, 就調(diào)用 getLRUClock() 實(shí)時(shí)獲取當(dāng)前的時(shí)間, 因?yàn)轭l率太低了, 會(huì)造成更多的對(duì)象的訪問時(shí)間一樣
    if (1000/server.hz <= LRU_CLOCK_RESOLUTION) {
        atomicGet(server.lruclock,lruclock);
    } else {
        lruclock = getLRUClock();
    }
    return lruclock;
}

3.3.3 lfu 策略, 對(duì)象的訪問頻率設(shè)計(jì)

對(duì)象的 lfu 同樣是存放在 redisObject 的 lru:LRU_BITS 字段。 這個(gè) 24 bits 字段, 被分為兩部分

高 16 位用來記錄訪問時(shí)間 (單位為分鐘,ldt, last decrement time)

低 8 位用來記錄相對(duì)的訪問次數(shù), 簡(jiǎn)稱 counter (logc, logistic counter)

Redis 中對(duì) LFU 的實(shí)現(xiàn)比較特殊, 通過時(shí)間衰減的方式近似達(dá)到了 LFU 的效果。
大體的思路如下:

對(duì)象創(chuàng)建時(shí), 初始訪問次數(shù)為 5 (避免剛創(chuàng)建出來, 對(duì)象就被回收), 同時(shí)記錄下當(dāng)前時(shí)間, 單位分鐘

對(duì)象被訪問時(shí), 獲取當(dāng)前時(shí)間, 單位分鐘, 當(dāng)前時(shí)間 - 對(duì)象本身記錄的時(shí)間, 得到相差多少分鐘, 訪問次數(shù)就減少多少

然后對(duì)象的訪問次數(shù) + 1, 再次記錄下當(dāng)前時(shí)間

這樣對(duì)象在單位分鐘內(nèi), 訪問越頻繁, 訪問次數(shù)越大, 同時(shí)隨著時(shí)間的推移, 沒有進(jìn)行訪問, 訪問次數(shù)會(huì)逐漸減少, 從而達(dá)到了 LFU 的效果。

ldt 記錄的是最近一次訪問的時(shí)間, 16 位, 所以最大值為 65535, 單位是分鐘, 差不多 45 天左右。
也就是一個(gè)對(duì)象如果一直被訪問, 到了第 45 天后, 這個(gè)值又會(huì)重新回到 0 開始計(jì)算。

ldt 的計(jì)算

unsigned long LFUGetTimeInMinutes(void) {
  // & 65535 保證時(shí)間的范圍在 0 ~ 65535 之間, 不會(huì)超過 16 數(shù)值的大小   
  return (server.unixtime/60) & 65535;
}

同 lru 一樣, lruclock 的計(jì)算, 后面的時(shí)間比前面的時(shí)間小,
說明后面的時(shí)間到了下一輪的重新開始了, 這時(shí)只需要后面的時(shí)間 + 65535 - 前面的時(shí)間, 就能得到 2 個(gè)時(shí)間的差值了。

logc 記錄的是一個(gè)相對(duì)的訪問次數(shù)。
本身只有 8 位, 也就是最大值為 255, 也就是一個(gè)對(duì)象只能保存 255 次訪問次數(shù), 這個(gè)基本不同滿足日常的使用。
所以 Redis 內(nèi)部設(shè)計(jì)了一個(gè)隨機(jī)公式, 控制訪問次數(shù)的增長(zhǎng), 即每次訪問, 訪問次數(shù)加不加一, 通過隨機(jī)判斷。

uint8_t LFULogIncr(uint8_t counter) {
    // 當(dāng)前的訪問次數(shù)已經(jīng)達(dá)到了最大值了
    if (counter == 255) 
        return 255;

    // 產(chǎn)生一個(gè)隨機(jī)數(shù)
    double r = (double)rand()/RAND_MAX;
    // 獲取一個(gè)基礎(chǔ)值, 當(dāng)前的次數(shù) - 對(duì)象初始化的默認(rèn)次數(shù) (LFU_INIT_VAL = 5)
    double baseval = counter - LFU_INIT_VAL;
    if (baseval < 0) baseval = 0;
    // 1.0 / 基礎(chǔ)值 * server.lfu_log_factor (默認(rèn)值, 10, 可配置) + 1, 得到一個(gè)數(shù)
    double p = 1.0/(baseval*server.lfu_log_factor+1);
    // 得到的數(shù)大于隨機(jī)出來的數(shù), 訪問次數(shù) + 1
    if (r < p) counter++;
    return counter;
}

官方的測(cè)試數(shù)據(jù) (可以簡(jiǎn)單看成, counter = 5, 在 100 - 1000w 次的調(diào)用, lfu_log_factor 不同取值下, 最終的 counter 的值)

lfu_log_factor 取值100 次1000 次10w 次100w 次1000w 次
0104255255255255
11849255255255
101018142255255
10081149143255

lfu_log_factor 設(shè)置為 10 的情況下, 在 100w 次的訪問中, 訪問次數(shù)才達(dá)到為 255, 也就是最大值。
基本可以滿足 10w 次的使用

3.3.3.1 counter 衰減機(jī)制

每個(gè)對(duì)象被返回時(shí), counter 都會(huì)先進(jìn)行一個(gè)衰減操作, 然后再通過上面的隨機(jī)公式進(jìn)行判斷次數(shù)是否需要增加。

衰減的過程如下

unsigned long LFUDecrAndReturn(robj *o) {

    // 右移 8 為, 也就是得的了高位的 16 位, 即 ldt, 得到上次記錄的時(shí)間
    unsigned long ldt = o->lru >> 8;
    // 得到當(dāng)前保存的次數(shù)
    unsigned long counter = o->lru & 255;

    // lfu_decay_time 衰減時(shí)間, 默認(rèn) 1, 單位分鐘
    // 如果沒有配置 lfu_decay_time, 則默認(rèn)不進(jìn)行衰減, counter 當(dāng)前是多少就是多少
    // 獲取 2 次訪問的時(shí)間差 / lfu_decay_time, 得到經(jīng)過了多少個(gè)時(shí)間段   
    unsigned long num_periods = server.lfu_decay_time ? LFUTimeElapsed(ldt) / server.lfu_decay_time : 0;
    if (num_periods)
        // 最新的次數(shù) = 當(dāng)前的次數(shù) - 經(jīng)過了多少個(gè)時(shí)間段, 小于 0 時(shí), 設(shè)置為 0 
        counter = (num_periods > counter) ? 0 : counter - num_periods;
    return counter;
}

// 距離上次訪問相差多少分鐘
unsigned long LFUTimeElapsed(unsigned long ldt) {
    unsigned long now = LFUGetTimeInMinutes();
    if (now >= ldt) return now-ldt;
    return 65535-ldt+now;
}

3.3.3.2 對(duì)象的訪問頻率設(shè)計(jì)

Redis 每次通過 key 在數(shù)據(jù)庫(kù)中查詢對(duì)應(yīng)的 value 時(shí), 在找到時(shí), 就會(huì)進(jìn)行 lru 字段的更新

robj *lookupKey(redisDb *db, robj *key, int flags) {
    
    dictEntry *de = dictFind(db->dict,key->ptr);
    if (de) {
        robj *val = dictGetVal(de);

        if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && !(flags & LOOKUP_NOTOUCH)) {
            // 淘汰策略設(shè)置的的 LFU 策略
            if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
                updateLFU(val);
            } else {
                val->lru = LRU_CLOCK();
            }
        }
    } else {
        return NULL;
    }
}

void updateLFU(robj *val) {
    // 通過衰減機(jī)制, 得到最新的 counter
    unsigned long counter = LFUDecrAndReturn(val);
    // 通過隨機(jī)公式, 得到最新的 counter
    counter = LFULogIncr(counter);
    // 將最新的 counter 和 當(dāng)前時(shí)間保存到 lru 字段中
    val->lru = (LFUGetTimeInMinutes()<<8) | counter;
}

3.4 Redis 內(nèi)存淘汰策略的實(shí)現(xiàn)

Redis 的內(nèi)存的實(shí)現(xiàn)方式都是通過隨機(jī)采樣 + 比較 lru 值決定是否淘汰的方式實(shí)現(xiàn)的。

大體過程如下:

  • Redis 啟動(dòng)時(shí), 會(huì)初始一個(gè)默認(rèn)容量為 16 的待淘汰數(shù)據(jù)池 evictionPoolEntry (本質(zhì)就是一個(gè)數(shù)組)
  • 每個(gè)存入到 Redis 的對(duì)象 (redisObject) 都會(huì)在初始其 24 位的 lru 字段 (lru: 一個(gè)相對(duì)的訪問時(shí)間, lfu: 一個(gè)相對(duì)的訪問次數(shù))
  • 后面每次訪問 Redis 的對(duì)象時(shí), 更新其 lru 字段的值
  • 同時(shí)每次執(zhí)行一個(gè) Redis 命令時(shí), 就會(huì)判斷一下當(dāng)前的內(nèi)存是否足夠, 如果不夠, 就計(jì)算出需要釋放多少內(nèi)存, 然后進(jìn)行內(nèi)存淘汰

內(nèi)存淘汰的過程如下:

4.1 首次淘汰從數(shù)據(jù)字典或過期字典 (由配置的淘汰策略決定) 中隨機(jī)抽樣選出最多 N 個(gè)數(shù)據(jù)放入到一個(gè)樣例池
數(shù)據(jù)量 N: 由 redis.conf 配置的 maxmemory-samples 決定, 默認(rèn)值是 5。 配置為 10 將非常接近真實(shí) LRU 效果。
采樣參數(shù) maxmemory-samples 配置的數(shù)值越大, 就越能精確的查找到待淘汰的緩存數(shù)據(jù), 但是也消耗更多的 CPU 計(jì)算, 執(zhí)行效率降低。
同時(shí)為了避免長(zhǎng)時(shí)間找不到足夠的數(shù)據(jù)填充樣例池, 強(qiáng)制寫死了單次尋找數(shù)據(jù)的最大次數(shù)是 maxsteps = N*10。

4.2 再次淘汰遍歷整個(gè)樣例池, 遍歷的對(duì)象通過 lru 計(jì)算處理的值, 只要比待淘汰數(shù)據(jù)池中的任意一條數(shù)據(jù)的小, 就將該數(shù)據(jù)填充至待淘汰數(shù)據(jù)池。
第一次淘汰時(shí), 待淘汰數(shù)據(jù)池為空, 所以第一次淘汰時(shí), 會(huì)將所有的樣例數(shù)據(jù)填充到待淘汰數(shù)據(jù)池中, 這個(gè)池子后面就都會(huì)有數(shù)據(jù), 一直存在著。
后續(xù)的淘汰時(shí), 樣例池 中的數(shù)據(jù)就有可能進(jìn)入到待淘汰數(shù)據(jù)池中, 也有可能不進(jìn)入。

4.3 執(zhí)行淘汰待淘汰數(shù)據(jù)池的尾部向前找到第一個(gè)可以刪除的 key (此時(shí)找到的 key 就是值最小/大的, 既空閑時(shí)間最大/訪問次數(shù)最小/存活時(shí)間最小), 對(duì)其進(jìn)行淘汰

4.4 繼續(xù)淘汰計(jì)算刪除了一個(gè) key 后內(nèi)存釋放了多少, 如果沒達(dá)到要求的釋放量, 就回到步驟 4.1 繼續(xù)淘汰

3.4.1 Redis 內(nèi)存淘汰策略的代碼實(shí)現(xiàn)

入口: 每個(gè)命令的執(zhí)行處

int processCommand(client *c) {
    ...

    // 有設(shè)置最大內(nèi)存 同時(shí)當(dāng)前沒有 lua 腳本超時(shí)的情況
    if (server.maxmemory && !server.lua_timedout) {
        // 有必要時(shí), 嘗試釋放內(nèi)存
        int out_of_memory = freeMemoryIfNeededAndSafe() == C_ERR;

        // 內(nèi)存不夠 同時(shí)執(zhí)行的命令是變更命令 或者 當(dāng)前的客戶端開啟了事務(wù), 同時(shí)執(zhí)行的命令不是 exec 
        if (out_of_memory && (c->cmd->flags & CMD_DENYOOM || (c->flags & CLIENT_MULTI && c->cmd->proc != execCommand))) {
            flagTransaction(c);
            // 響應(yīng) -OOM command not allowed when used memory > 'maxmemory'
            addReply(c, shared.oomerr);
            return C_OK;
        }
    }

    ...
}

int freeMemoryIfNeededAndSafe(void) {
    // 當(dāng)前有 lua 腳本執(zhí)行超時(shí)或者真正加載數(shù)據(jù), 返回成功
    if (server.lua_timedout || server.loading) return C_OK;
    // 是否內(nèi)存如果有必要的話
    return freeMemoryIfNeeded();
}

釋放內(nèi)存的核心函數(shù)

int freeMemoryIfNeeded(void) {

    // 如果是從節(jié)點(diǎn)同時(shí)配置了從節(jié)點(diǎn)忽略內(nèi)存配置, 直接返回
    if (server.masterhost && server.repl_slave_ignore_maxmemory) return C_OK;

    // mem_reported 保存了整個(gè) Redis 已經(jīng)使用的內(nèi)存
    // mem_tofree 經(jīng)過計(jì)算本次應(yīng)該釋放的內(nèi)存, 等于當(dāng)前已經(jīng)使用的內(nèi)存 - 用于主從復(fù)制的復(fù)制緩沖區(qū)大小 - 配置的 maxmemory
    // mem_freed 已經(jīng)釋放了多少內(nèi)存
    size_t mem_reported, mem_tofree, mem_freed;

    long long delta;

    // 從節(jié)點(diǎn)個(gè)數(shù)
    int slaves = listLength(server.slaves);

    // 判斷當(dāng)前的內(nèi)存狀態(tài), 如果足夠, 直接返回
    if (getMaxmemoryState(&mem_reported,NULL,&mem_tofree,NULL) == C_OK)
        return C_OK;

    // 如果配置的策略為  noeviction
    if (server.maxmemory_policy == MAXMEMORY_NO_EVICTION)
        goto cant_free;

    mem_freed = 0;

    // 沒有達(dá)到需要的內(nèi)存大小, 繼續(xù)循環(huán)
    while (mem_freed < mem_tofree) {

        static unsigned int next_db = 0;
        sds bestkey = NULL;
        int bestdbid;
        redisDb *db;
        dict *dict;
        dictEntry *de;

        
        if (server.maxmemory_policy & (MAXMEMORY_FLAG_LRU|MAXMEMORY_FLAG_LFU) || server.maxmemory_policy == MAXMEMORY_VOLATILE_TTL) {
            // LRU + LFU + TTL 策略

            // 淘汰池
            struct evictionPoolEntry *pool = EvictionPoolLRU;

            while(bestkey == NULL) {
                
                // 遍歷 16 個(gè)數(shù)據(jù)庫(kù)
                for (i = 0; i < server.dbnum; i++) {
                    db = server.db+i;
                    // 根據(jù) volatile 或 all 選擇對(duì)應(yīng)的數(shù)據(jù)字典
                    dict = (server.maxmemory_policy & MAXMEMORY_FLAG_ALLKEYS) ? db->dict : db->expires;
                    // 獲取字典的數(shù)據(jù)大小, keys 為當(dāng)前數(shù)據(jù)庫(kù)的 key 的數(shù)量
                    if ((keys = dictSize(dict)) != 0) {
                        evictionPoolPopulate(i, dict, db->dict, pool);
                        total_keys += keys;
                    }
                }

                // 沒有可以處理的 keys
                if (!total_keys) break;

                // EVPOOL_SIZE =  16
                for (k = EVPOOL_SIZE-1; k >= 0; k--) {
                    if (pool[k].key == NULL) continue;
                    bestdbid = pool[k].dbid;

                    // 從數(shù)據(jù)庫(kù)中獲取對(duì)應(yīng)的節(jié)點(diǎn)
                    if (server.maxmemory_policy & MAXMEMORY_FLAG_ALLKEYS) {
                        de = dictFind(server.db[pool[k].dbid].dict, pool[k].key);
                    } else {
                        de = dictFind(server.db[pool[k].dbid].expires, pool[k].key);
                    }

                    // 釋放緩存
                    if (pool[k].key != pool[k].cached)
                        sdsfree(pool[k].key);
                    pool[k].key = NULL;
                    pool[k].idle = 0;

                    // 找到的釋放對(duì)象存在, 先跳出這次循環(huán)
                    if (de) {
                        bestkey = dictGetKey(de);
                        break;
                    } else {
                        // 不存在, 進(jìn)行循環(huán)查找
                    }
                }
            }

        } else if (server.maxmemory_policy == MAXMEMORY_ALLKEYS_RANDOM || server.maxmemory_policy == MAXMEMORY_VOLATILE_RANDOM) {
            // random 策略
        }

        // 刪除找到的 key
        if (bestkey) {
            
            db = server.db+bestdbid;

            // 將 key 封裝為 redisObject 對(duì)象
            robj *keyobj = createStringObject(bestkey,sdslen(bestkey));

            // 傳播 key 過期信息到主從復(fù)制和 AOF 文件
            propagateExpire(db,keyobj,server.lazyfree_lazy_eviction);

            // 獲取當(dāng)前的內(nèi)存大小
            delta = (long long) zmalloc_used_memory();
            // 同步刪除或異步刪除 key
            if (server.lazyfree_lazy_eviction) {
                dbAsyncDelete(db,keyobj);
            else
                dbSyncDelete(db,keyobj);
            }

            // 計(jì)算本次釋放的內(nèi)存
            delta -= (long long) zmalloc_used_memory();
            mem_freed += delta;
            // 釋放創(chuàng)建的 key redisObject 對(duì)象
            decrRefCount(keyobj);
            keys_freed++;

            // 如果有從節(jié)點(diǎn), 推送緩沖區(qū)的數(shù)據(jù)
            if (slaves) flushSlavesOutputBuffers();

            // 支持異步清除 同時(shí) 清除了 16 個(gè) key
            if (server.lazyfree_lazy_eviction && !(keys_freed % 16)) {
                // 再次判斷內(nèi)存情況, 如果內(nèi)存足夠了
                if (getMaxmemoryState(NULL,NULL,NULL,NULL) == C_OK) {
                    // 更新已經(jīng)釋放的緩存大小 = 需要釋放的緩存大小
                    mem_freed = mem_tofree;
                }
            }

        }

        // 本次釋放沒有處理成功任何一個(gè) key
        if (!keys_freed) {
            goto cant_free; 
        }
    }

    return C_OK;


cant_free:
    // 沒有內(nèi)存可以分配了, 做唯一可以做的一件事: 檢查是否有 lazyfree 線程在執(zhí)行釋放內(nèi)存任務(wù), 有進(jìn)行等待
    // 知道沒有任務(wù)或者已有的內(nèi)存達(dá)到了需要釋放的內(nèi)存
    while(bioPendingJobsOfType(BIO_LAZY_FREE)) {
        // 當(dāng)前的內(nèi)存達(dá)到了現(xiàn)在需要的釋放的內(nèi)存, 結(jié)束檢查
        if (((mem_reported - zmalloc_used_memory()) + mem_freed) >= mem_tofree)
            break;
        usleep(1000);
    }
    return C_ERR;  

淘汰池的填充

void evictionPoolPopulate(int dbid, dict *sampledict, dict *keydict, struct evictionPoolEntry *pool) {

    int j, k, count;
    // 采樣結(jié)果數(shù)組, 最大容量為 mamemory_samples 的大小
    dictEntry *samples[server.maxmemory_samples];

    // 從 sampledict 字典中采樣 server.maxmemory_samples 個(gè) key 存放到 samples, 同時(shí)返回總共采樣的多少個(gè)
    count = dictGetSomeKeys(sampledict,samples,server.maxmemory_samples);

    for (j = 0; j < count; j++) {

        unsigned long long idle;
        sds key;
        robj *o;
        dictEntry *de;

        de = samples[j];
        key = dictGetKey(de);       

        if (server.maxmemory_policy != MAXMEMORY_VOLATILE_TTL) {
            if (sampledict != keydict) de = dictFind(keydict, key);
            o = dictGetVal(de);
        }

        if (server.maxmemory_policy & MAXMEMORY_FLAG_LRU) {
            // LRU 算法
            idle = estimateObjectIdleTime(o);
        } else if (server.maxmemory_policy & MAXMEMORY_FLAG_LFU) {
            // LRU 算法
            idle = 255 - LFUDecrAndReturn(o);
        } else if (server.maxmemory_policy == MAXMEMORY_VOLATILE_TTL) {
            // TTL 算法
            idle = ULLONG_MAX - (long)dictGetVal(de);
        } else {
            serverPanic("Unknown eviction policy in evictionPoolPopulate()");
        }

        k = 0;
        // 從 evictionPoolEntry 淘汰池中找到第一個(gè)閑置時(shí)間比當(dāng)前淘汰 key 大的
        while (k < EVPOOL_SIZE && pool[k].key && pool[k].idle < idle) 
            k++;
        
        if (k == 0 && pool[EVPOOL_SIZE-1].key != NULL) {
            // 如果找到的 key 比淘汰池中閑置時(shí)間最小的 key 還小, 同時(shí)淘汰池沒有空間了, 則跳過這個(gè) key
            continue;
        } else if (k < EVPOOL_SIZE && pool[k].key == NULL) {
            // 插入的位置為空, 直接進(jìn)入到下面的賦值節(jié)點(diǎn)
        } else {
            // 核心就是將找到的位置 k 空出來

            // 最后的位置為空
            if (pool[EVPOOL_SIZE-1].key == NULL) {
                // 將原本 k 位置和后面的數(shù)據(jù)向后移動(dòng) 1 位 
                sds cached = pool[EVPOOL_SIZE-1].cached;
                memmove(pool+k+1, pool+k, sizeof(pool[0])*(EVPOOL_SIZE-k-1));
                pool[k].cached = cached;
            } else {
                // 插入的位置不為空 
                // 將原本 k 位置前面的數(shù)據(jù)往前移動(dòng) 1 位, 原本的第一位丟棄
                k--;
                sds cached = pool[0].cached;
                if (pool[0].key != pool[0].cached) sdsfree(pool[0].key);
                memmove(pool,pool+1,sizeof(pool[0])*k);
                pool[k].cached = cached;
            }
        }

        // 把找到的 key 放到 k 的位置
        int klen = sdslen(key);
        // EVPOOL_CACHED_SDS_SIZE = 255
        if (klen > EVPOOL_CACHED_SDS_SIZE) {
            // 創(chuàng)建一個(gè)新的 key 賦值給 pool[k].key
            pool[k].key = sdsdup(key);
        } else {
            // 從 key 中拷貝 klen + 1 的長(zhǎng)度到 pool[k].cached
            memcpy(pool[k].cached,key,klen+1);

            sdssetlen(pool[k].cached,klen);
            pool[k].key = pool[k].cached;
        }
        pool[k].idle = idle;
        pool[k].dbid = dbid;
    }
}

unsigned int dictGetSomeKeys(dict *d, dictEntry **des, unsigned int count) {
    unsigned long j; 
    unsigned long tables;
    unsigned long stored = 0, maxsizemask;
    unsigned long maxsteps;

    // 字典中的數(shù)據(jù)量小于需要的個(gè)數(shù), 取的個(gè)數(shù)變?yōu)樽值涞臄?shù)據(jù)大小
    if (dictSize(d) < count) count = dictSize(d);

    // 最大次數(shù) = 次數(shù) * 10
    maxsteps = count*10;

    /* 如果字典在 rehash 中, 嘗試 count 一樣次數(shù)的 rehash */
    for (j = 0; j < count; j++) {
        if (dictIsRehashing(d))
            _dictRehashStep(d);
        else
            break;
    }

    // 獲取總的 HashTable 個(gè)數(shù), 如果在 rehash 中就是 2 個(gè), 否則 1 個(gè)
    tables = dictIsRehashing(d) ? 2 : 1;
    // 獲取數(shù)組大小的掩碼, 用于計(jì)算索引值
    maxsizemask = d->ht[0].sizemask;
    if (tables > 1 && maxsizemask < d->ht[1].sizemask)
        maxsizemask = d->ht[1].sizemask;

    // 隨機(jī)獲取一個(gè)位置
    unsigned long i = random() & maxsizemask;
    unsigned long emptylen = 0;

    // 獲取到的個(gè)數(shù)沒達(dá)到需要的個(gè)數(shù) 或者嘗試的次數(shù)還沒達(dá)到 0 
    while(stored < count && maxsteps--) {
        for (j = 0; j < tables; j++) {
    
            // 如果字典在 rehash 中, 同時(shí)當(dāng)前處理的是第一個(gè)字典, 處理的位置小于 rehash 下次處理的位置, 
            // 則跳過這個(gè)位置, 直接到 rehash 下次處理的位置
            // 因?yàn)榈谝粋€(gè)字典 rehash 下次處理的位置前的數(shù)據(jù)都遷移到第二個(gè)字典中了
            if (tables == 2 && j == 0 && i < (unsigned long) d->rehashidx) {
                // 防止獲取數(shù)據(jù)的位置 i 超過第二個(gè)字典的大小
                if (i >= d->ht[1].size)
                    i = d->rehashidx;
                else
                    continue;
            }

            // 超過了數(shù)組的長(zhǎng)度
            if (i >= d->ht[j].size) continue;
            // 獲取對(duì)應(yīng)位置的數(shù)據(jù)
            dictEntry *he = d->ht[j].table[i];

            // 對(duì)應(yīng)的位置為 null
            if (he == NULL) {
                emptylen++;
                // 獲取 null 數(shù)據(jù)的次數(shù)大于 5 次 同時(shí) 大于需要的過期 key 的個(gè)數(shù)
                if (emptylen >= 5 && emptylen > count) {
                    // 重新計(jì)算獲取的位置 i, 重新獲取
                    i = random() & maxsizemask;
                    emptylen = 0;
                }
            } else {
                emptylen = 0;
                while (he) {
                    // he 本身是鏈表, 計(jì)算從鏈表中獲取到的個(gè)數(shù), 夠了結(jié)束, 不夠就 i+1, 從字典的下一個(gè)位置繼續(xù)獲取
                    *des = he;
                    des++;
                    he = he->next;
                    stored++;
                    if (stored == count) return stored;
                }
            }
        }
        i = (i+1) & maxsizemask;
    }
    return stored;
}

dictGetSomeKeys 函數(shù)簡(jiǎn)單理解就是, 通過 random() 得到一個(gè)隨機(jī)數(shù), 這個(gè)隨機(jī)數(shù) & 數(shù)組大小的掩碼, 得到一個(gè)位置, 從這個(gè)位置向后獲取 count 個(gè)過期 key。
這個(gè)處理的過程中

有可能字典在 rehash 中, 數(shù)據(jù)分布在 2 個(gè)字典中, 所以有時(shí)第一個(gè)字典獲取不到需要到第二個(gè)字典獲取

需要的過期 key 的個(gè)數(shù)小于等于 5 個(gè), 通過計(jì)算得到的位置獲取到的數(shù)據(jù)連續(xù)都為 null, 則重新通過 random() 計(jì)算一個(gè)新的位置

為了防止長(zhǎng)時(shí)間的需要, 在外面還計(jì)算了最大的循環(huán)次數(shù)

從上面的代碼實(shí)現(xiàn)可以看出, Redis 內(nèi)部對(duì) LRU + LFU 的實(shí)現(xiàn)都是不是很正式的實(shí)現(xiàn), 帶有一定的誤差和隨機(jī)性。

其本身考慮主用是從性能上做的折中。比如傳統(tǒng)的 LRU 算法, 需要將所有的數(shù)據(jù)維護(hù)一個(gè)雙向鏈表

訪問節(jié)點(diǎn), 如果節(jié)點(diǎn)存在, 則將該節(jié)點(diǎn)移動(dòng)到鏈表的頭節(jié)點(diǎn), 并返回節(jié)點(diǎn)值, 不存在就返回 null

新增節(jié)點(diǎn), 節(jié)點(diǎn)不存在, 就在鏈表的頭部新增節(jié)點(diǎn), 如果節(jié)點(diǎn)存在, 則更新節(jié)點(diǎn)數(shù)據(jù), 然后將節(jié)點(diǎn)移動(dòng)到鏈表的頭節(jié)點(diǎn)

需要消耗的內(nèi)存在維護(hù)鏈表的 + 節(jié)點(diǎn)的挑戰(zhàn), 對(duì)于一個(gè)大規(guī)模的數(shù)據(jù), 這個(gè)消耗是非常大的。
所以 Redis 采用了其思想, 通過另外的方式達(dá)到類似的效果。

4 附錄: Redis 幾個(gè)對(duì)象的介紹

4.1 Redis 中的字典

4.2.1 HashTable

存儲(chǔ)在 Redis 中的基本都是鍵值對(duì), 而這種鍵值對(duì)存儲(chǔ), 同時(shí)可以通過 key 快速查詢到對(duì)應(yīng)的 value, 最合適的實(shí)現(xiàn)就是 HashTable 了。
而實(shí)現(xiàn) HashTable 的底層結(jié)構(gòu),基本就是一個(gè)數(shù)組或者鏈表, 同時(shí)為了解決 hash 沖突, 數(shù)組或鏈表的每個(gè)節(jié)點(diǎn)定義為一個(gè)鏈表。

Redis 中對(duì) HashTable 的實(shí)現(xiàn)也是如此, 大體如下

Alt 'dictht 設(shè)計(jì)'

Redis 中實(shí)現(xiàn)的 HastTable 叫做 dictht (Dictionary Hash Table)

對(duì)應(yīng)的定義如下:

typedef struct dictht {
    // 存放節(jié)點(diǎn)的數(shù)組
    dictEntry **table;
    // HashTable 的大小, 2 的冪次方
    unsigned long size;
    // HashTable 的大小掩碼, 用于計(jì)算索引值
    unsigned long sizemask;
    // HashTable 中已經(jīng)使用的節(jié)點(diǎn)個(gè)數(shù)
    unsigned long used;
} dictht;

真實(shí)存儲(chǔ)數(shù)據(jù)的鏈表節(jié)點(diǎn)的定義如下:

typedef struct dictEntry {
    // 存儲(chǔ)的鍵值對(duì)的 key
    void *key;
    // 存儲(chǔ)的鍵值對(duì)的 value
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    // 指向下一個(gè)節(jié)點(diǎn)
    struct dictEntry *next;
} dictEntry;

key + v(value) + next 一個(gè)簡(jiǎn)單的鏈表定義。
有點(diǎn)特殊的就是對(duì)應(yīng)著 value 屬性的 v 的定義是一個(gè)聯(lián)合體, 會(huì)在不同場(chǎng)景下使用不同的字段,
比如一個(gè)鍵值對(duì)的過期時(shí)間就存放在 s64 中, 這個(gè) value 存放的值就放在 val 中。

一個(gè) dictEntry 的字段存放內(nèi)容大體如下:

Alt 'dictEntry 內(nèi)容'

4.2.2 字典

在使用 HashTable 時(shí), 都需要提前聲明好容量, 而隨著程序的運(yùn)行, 存放到 HashTable 的數(shù)據(jù)會(huì)越來越多, 最終達(dá)到上限, 這時(shí)就需要進(jìn)行擴(kuò)容了。
在 Java 的 HashMap 的擴(kuò)容過程

創(chuàng)建一個(gè)更大容量的數(shù)組

將 HashMap 中舊數(shù)組一次性遷移到新的數(shù)組中

清除掉舊數(shù)組

這個(gè)擴(kuò)容沒多大問題, 但是放到 Redis 中合適嗎?

Redis 是一個(gè)存內(nèi)存的數(shù)據(jù)庫(kù), 所有的數(shù)據(jù)都存放在內(nèi)存中, 基本是 GB 級(jí)別的數(shù)據(jù)量, 每次擴(kuò)容遷移的數(shù)據(jù)量很多

Redis 是一個(gè)單線程的數(shù)據(jù)庫(kù), 一次只能處理一個(gè)事情, 如果全力在做擴(kuò)容, 那么其他的請(qǐng)求將無法處理

所以 Redis 采用了一種 漸進(jìn)式 rehash 的方法解決擴(kuò)容縮容的問題, 過程如下

維護(hù) 2 個(gè) dictht, 一個(gè)是真實(shí)存儲(chǔ)數(shù)據(jù)的 HashTable A, 一個(gè)是擴(kuò)容后存儲(chǔ)數(shù)據(jù)的 TableTable B + 一個(gè) rehash 位置的索引, 初始值為 0

在 rehash >=0 期間, 每次對(duì) HashTable 進(jìn)行操作, 除了正常的操作外, 還會(huì)將 A rehash 位置的數(shù)據(jù)都遷移到 B, 然后 rehash + 1

隨著對(duì) HashTable 的不斷操作, 最終 A 中的數(shù)據(jù)都會(huì)遷移到 B, 這時(shí)將 rehash 設(shè)置為 -1

基于上面的漸進(jìn)式 rehash 分析, 實(shí)際是需要 2 個(gè) dictht, 所以 Redis 在此至上多封裝了一層

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];   // 2 個(gè) HashTable
    long rehashidx; // rehash 的索引
    unsigned long iterators;
} dict;

這個(gè)就是 Redis 中的字典, 用于存儲(chǔ)鍵值對(duì)的結(jié)構(gòu)。

在將這個(gè)結(jié)構(gòu)放到一個(gè) redisDb 就是我們常見的 Redis 數(shù)據(jù)庫(kù)了

typedef struct redisDb {
    dict *dict; 
    dict *expires;
    ....
} redisDb;

redisDb 就是我們常說的 Redis 16 個(gè)數(shù)據(jù)庫(kù)的定義了。 每個(gè)數(shù)據(jù)庫(kù)中都有 2 個(gè)字典

dict 正常的字典, 存儲(chǔ)沒有設(shè)置過期時(shí)間的鍵值對(duì)

expires 過期字典, 存儲(chǔ)設(shè)置了過期時(shí)間的鍵值對(duì)

4.2 Redis 的內(nèi)存待淘汰池

struct evictionPoolEntry {
    unsigned long long idle;    // 對(duì)象空閑時(shí)間 (使用的算法是 LFU 則是逆頻率)
    sds key;                    // 待淘汰的鍵值對(duì)的 key
    sds cached;                 // 緩存的 key 名稱 SDS 對(duì)象
    int dbid;                   // 待淘汰鍵值對(duì)的 key 所在的數(shù)據(jù)庫(kù) ID
};

5 參考

Redis源碼解析-LRU

Redis內(nèi)存兜底策略——內(nèi)存淘汰及回收機(jī)制

到此這篇關(guān)于深入理解Redis內(nèi)存回收和內(nèi)存淘汰機(jī)制的文章就介紹到這了,更多相關(guān)Redis內(nèi)存回收和內(nèi)存淘汰機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • redis實(shí)現(xiàn)加鎖的幾種方法示例詳解

    redis實(shí)現(xiàn)加鎖的幾種方法示例詳解

    這篇文章主要給大家介紹了關(guān)于redis實(shí)現(xiàn)加鎖的幾種方法,加鎖命令分別是INCR、SETNX和SET,文中給出了詳細(xì)的示例代碼,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-09-09
  • redis使用skiplist跳表的原因解析

    redis使用skiplist跳表的原因解析

    經(jīng)常會(huì)有人問這個(gè)問題,redis中為什么要使用跳表?這個(gè)問題,redis作者已經(jīng)給出過明確答案,今天通過本文再給大家講解下這個(gè)問題,對(duì)redis?skiplist跳表知識(shí)感興趣的朋友一起看看吧
    2022-10-10
  • Redis高效率原因及數(shù)據(jù)結(jié)構(gòu)分析

    Redis高效率原因及數(shù)據(jù)結(jié)構(gòu)分析

    這篇文章主要為大家詳細(xì)的介紹了Redis高效的原因以及分析了Redis高效的數(shù)據(jù)結(jié)構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-09-09
  • 如何用redis?setNX命令來加鎖

    如何用redis?setNX命令來加鎖

    這篇文章主要介紹了如何用redis?setNX命令來加鎖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Redis實(shí)現(xiàn)布隆過濾器的代碼詳解

    Redis實(shí)現(xiàn)布隆過濾器的代碼詳解

    布隆過濾器(Bloom?Filter)是Redis?4.0版本提供的新功能,它被作為插件加載到Redis服務(wù)器中,給Redis提供強(qiáng)大的去重功能,本文將給大家詳細(xì)介紹一下Redis布隆過濾器,文中有相關(guān)的代碼示例,需要的朋友可以參考下
    2023-07-07
  • 讓Redis在你的系統(tǒng)中發(fā)揮更大作用的幾點(diǎn)建議

    讓Redis在你的系統(tǒng)中發(fā)揮更大作用的幾點(diǎn)建議

    Redis在很多方面與其他數(shù)據(jù)庫(kù)解決方案不同:它使用內(nèi)存提供主存儲(chǔ)支持,而僅使用硬盤做持久性的存儲(chǔ);它的數(shù)據(jù)模型非常獨(dú)特,用的是單線程。另一個(gè)大區(qū)別在于,你可以在開發(fā)環(huán)境中使用Redis的功能,但卻不需要轉(zhuǎn)到Redis
    2014-06-06
  • Redis分布式鎖Redlock的實(shí)現(xiàn)

    Redis分布式鎖Redlock的實(shí)現(xiàn)

    本文主要介紹了Redis分布式鎖Redlock的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Linux下Redis安裝使用教程

    Linux下Redis安裝使用教程

    這篇文章主要為大家詳細(xì)介紹了Linux下Redis安裝使用教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Redis過期數(shù)據(jù)是否會(huì)被立馬刪除

    Redis過期數(shù)據(jù)是否會(huì)被立馬刪除

    這篇文章主要為大家介紹了Redis過期數(shù)據(jù)會(huì)被立馬刪除么的問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Redisson 加鎖解鎖的實(shí)現(xiàn)

    Redisson 加鎖解鎖的實(shí)現(xiàn)

    本文主要介紹了Redisson 加鎖解鎖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08

最新評(píng)論

天干天天天色天天日天天射| 91中文字幕免费在线观看| 日本少妇的秘密免费视频| 免费黄页网站4188| 国产福利小视频二区| 大肉大捧一进一出好爽在线视频 | 亚洲精品午夜aaa久久| 精品亚洲中文字幕av| 狍和女人的王色毛片| 偷偷玩弄新婚人妻h视频| 欧美黑人与人妻精品| 亚洲推理片免费看网站| 啊用力插好舒服视频| 亚洲嫩模一区二区三区| 精品91自产拍在线观看一区| 青青青视频自偷自拍38碰| h国产小视频福利在线观看| 自拍偷拍,中文字幕| 边摸边做超爽毛片18禁色戒 | 不卡一不卡二不卡三| 国产高清精品极品美女| 日韩中文字幕精品淫| 福利视频网久久91| 在线观看av亚洲情色| 老司机免费福利视频网| 天堂av在线最新版在线| 91麻豆精品久久久久| 真实国模和老外性视频| 宅男噜噜噜666免费观看| 午夜免费观看精品视频| 日本三极片视频网站观看| 大肉大捧一进一出好爽在线视频 | 中文字幕综合一区二区| 亚洲中文字幕乱码区| 亚洲粉嫩av一区二区三区| 久久久久久久亚洲午夜综合福利| av天堂中文字幕最新| 午夜国产免费福利av| 91精品国产麻豆国产| brazzers欧熟精品系列| 色97视频在线播放| 午夜美女少妇福利视频| 国产免费高清视频视频| 久久精品36亚洲精品束缚| 伊人精品福利综合导航| 天天色天天操天天透| 国产av一区2区3区| 新97超碰在线观看| 国产麻豆国语对白露脸剧情| 激情图片日韩欧美人妻| 3337p日本欧洲大胆色噜噜| av老司机精品在线观看| 天天操天天操天天碰| 青青操免费日综合视频观看| 大肉大捧一进一出好爽在线视频 | 国产之丝袜脚在线一区二区三区| 男女第一次视频在线观看| 深夜男人福利在线观看| 国产精品久久久久久美女校花| 大屁股肉感人妻中文字幕在线| 欧美亚洲一二三区蜜臀| 久草极品美女视频在线观看| 一区二区三区日本伦理| 国产精品久久久久国产三级试频| 超黄超污网站在线观看| 18禁无翼鸟成人在线| 在线新三级黄伊人网| 啊啊啊想要被插进去视频| sspd152中文字幕在线| 晚上一个人看操B片| 97精品视频在线观看| 久草视频首页在线观看| 93人妻人人揉人人澡人人| 国产极品精品免费视频| free性日本少妇| 国产精品人妻熟女毛片av久| 天天干天天操天天玩天天射| 天天色天天操天天透| 激情伦理欧美日韩中文字幕| 国产黄网站在线观看播放| 欧美精品 日韩国产| 亚洲国产精品久久久久蜜桃| 男女啪啪视频免费在线观看| 18禁无翼鸟成人在线| 成人18禁网站在线播放| 99精品免费观看视频| 亚洲特黄aaaa片| 丰满的子国产在线观看| 亚洲在线一区二区欧美| 懂色av蜜桃a v| 国产成人综合一区2区| 国产1区,2区,3区| 顶级尤物粉嫩小尤物网站| 人人妻人人澡欧美91精品| 久久久久久久一区二区三| 爱有来生高清在线中文字幕| 成人久久精品一区二区三区| 玖玖一区二区在线观看| 男人操女人的逼免费视频| 91免费放福利在线观看| 欧美亚洲国产成人免费在线| 久久久精品精品视频视频| 国产福利小视频免费观看| 18禁美女无遮挡免费| 精品一区二区三区三区88| 欧美成人一二三在线网| jiuse91九色视频| 日韩欧美国产一区不卡| 成人久久精品一区二区三区| 亚洲国产美女一区二区三区软件 | brazzers欧熟精品系列| 欧美伊人久久大香线蕉综合| 激情综合治理六月婷婷| 欧美综合婷婷欧美综合| 中文字幕人妻三级在线观看| 1000部国产精品成人观看视频| 亚洲精品欧美日韩在线播放| 国产aⅴ一线在线观看| 久久尻中国美女视频| 久久这里只有精彩视频免费| 久久精品亚洲成在人线a| 九色精品视频在线播放| 日本18禁久久久久久| 精品一区二区三区三区88 | 人妻凌辱欧美丰满熟妇| 欧美麻豆av在线播放| 日韩欧美高清免费在线| 国产精品入口麻豆啊啊啊 | 国产九色91在线观看精品| 亚洲中文精品人人免费| 天天躁日日躁狠狠躁躁欧美av| 亚洲卡1卡2卡三卡四老狼| 天天摸天天日天天操| 亚洲精品成人网久久久久久小说| 二区中出在线观看老师| 99精品国自产在线人| 一区二区三区国产精选在线播放| 毛片一级完整版免费| 中文字幕欧美日韩射射一| 成人av免费不卡在线观看| 快点插进来操我逼啊视频| 欧美黄片精彩在线免费观看| 亚洲狠狠婷婷综合久久app| 亚洲欧美精品综合图片小说| 97精品视频在线观看| 中文字幕av第1页中文字幕| 欧美地区一二三专区| 青青青青青操视频在线观看| 一本一本久久a久久精品综合不卡 亚洲另类综合一区小说 | 天天做天天干天天舔| 久久精品亚洲国产av香蕉| 国产又色又刺激在线视频| 亚洲中文精品人人免费| 欧美特级特黄a大片免费| 女同性ⅹxx女同h偷拍| 成人乱码一区二区三区av| 亚洲免费在线视频网站| 天天摸天天日天天操| 亚洲国产免费av一区二区三区| 亚洲人人妻一区二区三区| 国产精品自拍偷拍a| 2021久久免费视频| 91自产国产精品视频| 在线视频国产欧美日韩| 中文字幕乱码人妻电影| 午夜91一区二区三区| 国产亚洲欧美视频网站| 亚洲蜜臀av一区二区三区九色| tube69日本少妇| 大鸡巴操娇小玲珑的女孩逼| 91精品综合久久久久3d动漫| 中文字幕在线观看极品视频| 男人天堂色男人av| 欧美特色aaa大片| 亚洲 中文字幕在线 日韩| 五月色婷婷综合开心网4438| 国产精品一区二区av国| 久久久久久久亚洲午夜综合福利 | 亚洲成人精品女人久久久| 国产精品视频一区在线播放| 在线免费观看日本伦理| 最新欧美一二三视频| 免费观看理论片完整版| 做爰视频毛片下载蜜桃视频1| 91九色国产熟女一区二区| 在线免费观看av日韩| 日日操夜夜撸天天干| 女人精品内射国产99| 亚洲午夜电影之麻豆| 在线不卡成人黄色精品| 天天日夜夜干天天操| 国产高清在线观看1区2区| 欧美专区第八页一区在线播放| 日韩一个色综合导航| 欧美一级片免费在线成人观看 | 成人精品视频99第一页| 老司机你懂得福利视频| 天天插天天狠天天操| 成年人午夜黄片视频资源| 欧美中文字幕一区最新网址| 91免费福利网91麻豆国产精品| 人妻丝袜榨强中文字幕| 超碰97人人澡人人| 国产日本精品久久久久久久| 中国无遮挡白丝袜二区精品| 国产大鸡巴大鸡巴操小骚逼小骚逼| 亚洲成人情色电影在线观看| 狠狠地躁夜夜躁日日躁| 青娱乐极品视频青青草| 国产在线观看免费人成短视频| 99婷婷在线观看视频| xxx日本hd高清| 中国无遮挡白丝袜二区精品 | 人人妻人人人操人人人爽| 国内自拍第一页在线观看| 女警官打开双腿沦为性奴| 91中文字幕最新合集| 中文字幕高清资源站| 香港一级特黄大片在线播放| 亚洲无线观看国产高清在线| 国产亚洲精品欧洲在线观看| 日韩三级电影华丽的外出| 青青青视频自偷自拍38碰| 成年人午夜黄片视频资源| 超级碰碰在线视频免费观看| 色在线观看视频免费的| 成年人免费看在线视频| 国产高清精品一区二区三区| 国产极品美女久久久久久| 亚洲中文字幕人妻一区| 精品国产成人亚洲午夜| 天天躁日日躁狠狠躁躁欧美av| 中文字幕日韩精品日本| 天堂女人av一区二区| 精品一区二区三区欧美| 国产美女精品福利在线| 38av一区二区三区| 99热久久极品热亚洲| 日韩三级电影华丽的外出| 国产视频一区在线观看| 亚洲国际青青操综合网站| 91九色国产熟女一区二区| 狠狠躁夜夜躁人人爽天天天天97| 久久美欧人妻少妇一区二区三区| 硬鸡巴动态操女人逼视频| 国产品国产三级国产普通话三级| 青青热久免费精品视频在线观看| 国产免费av一区二区凹凸四季| 在线免费观看欧美小视频| 亚洲一区二区三区精品视频在线| 精品首页在线观看视频| 女警官打开双腿沦为性奴| 成人高清在线观看视频| 夜夜骑夜夜操夜夜奸| 黑人大几巴狂插日本少妇| 97国产精品97久久| 自拍偷拍vs一区二区三区| 91av精品视频在线| 亚洲国产中文字幕啊啊啊不行了| 40道精品招牌菜特色| 日本韩国在线观看一区二区| 国产va精品免费观看| 欧美黑人性暴力猛交喷水| 亚洲午夜电影在线观看| 国产女人叫床高潮大片视频| 亚洲欧美国产综合777| 美女视频福利免费看| 精品国产亚洲av一淫| 毛片一级完整版免费| 直接能看的国产av| 2012中文字幕在线高清| 国产午夜亚洲精品麻豆| 视频二区在线视频观看| 狠狠鲁狠狠操天天晚上干干| 亚洲av无硬久久精品蜜桃| 欧美日韩情色在线观看| chinese国产盗摄一区二区| 激情国产小视频在线| 伊人开心婷婷国产av| 亚洲美女美妇久久字幕组| 丰满少妇人妻xxxxx| av视网站在线观看| 亚洲成人精品女人久久久| 国产av一区2区3区| 亚洲高清国产自产av| 黑人大几巴狂插日本少妇| 在线观看免费视频网| 好男人视频在线免费观看网站| 美女少妇亚洲精选av| 动漫av网站18禁| 农村胖女人操逼视频| 国产精品自偷自拍啪啪啪| 精品乱子伦一区二区三区免费播| 99国内精品永久免费视频| 国产剧情演绎系列丝袜高跟| 人妻丝袜精品中文字幕| 亚洲丝袜老师诱惑在线观看| 91‖亚洲‖国产熟女| 日韩精品中文字幕播放| 99精品一区二区三区的区| 大胆亚洲av日韩av| 国产福利在线视频一区| av在线播放国产不卡| 99re国产在线精品| 国产高清女主播在线| 99久久激情婷婷综合五月天| 男人天堂av天天操| 国产实拍勾搭女技师av在线| 97国产精品97久久| 国产精品国产三级国产精东| 久久一区二区三区人妻欧美| 日韩成人免费电影二区| 自拍偷拍,中文字幕| 小穴多水久久精品免费看| 色综合久久无码中文字幕波多| 在线观看一区二区三级| 男人天堂色男人av| 亚洲欧洲一区二区在线观看| 青青青青在线视频免费观看| 男人天堂色男人av| 极品粉嫩小泬白浆20p主播 | 五十路在线观看完整版| 91大神福利视频网| 国产成人精品av网站| 亚洲一区二区三区偷拍女厕91| 久久热久久视频在线观看| 亚洲天堂成人在线观看视频网站| 超污视频在线观看污污污| 夜夜嗨av一区二区三区中文字幕| 在线不卡成人黄色精品| 国产视频在线视频播放| 国产日韩精品电影7777| 国产亚洲精品欧洲在线观看| 天天色天天舔天天射天天爽| 粗大的内捧猛烈进出爽大牛汉子| 亚洲天天干 夜夜操| 国产成人精品一区在线观看| 欧美老妇精品另类不卡片| 最新黄色av网站在线观看| 91亚洲手机在线视频播放| 亚洲一区二区三区精品乱码| 中文字幕在线乱码一区二区 | 班长撕开乳罩揉我胸好爽| 午夜精品在线视频一区| 国产又大又黄免费观看| 在线制服丝袜中文字幕| 综合色区亚洲熟妇shxstz| 在线亚洲天堂色播av电影| 日本美女性生活一级片| 欧美黄色录像免费看的| 中文字幕亚洲久久久| 北条麻妃av在线免费观看| 国产美女午夜福利久久| 很黄很污很色的午夜网站在线观看| 国产精品日韩欧美一区二区| 亚洲欧美激情中文字幕| 午夜免费观看精品视频| 日韩av有码中文字幕| 日韩av熟妇在线观看| www,久久久,com| 国产黄网站在线观看播放| 欧美一区二区三区啪啪同性| 午夜精品一区二区三区更新| 国产视频精品资源网站| 黄色片年轻人在线观看| 欧美视频中文一区二区三区| 成人资源在线观看免费官网| 精品久久婷婷免费视频| 午夜在线一区二区免费| 岳太深了紧紧的中文字幕| 欧美怡红院视频在线观看| 久久精品美女免费视频| 日本在线一区二区不卡视频| 欧美另类一区二区视频| 欧美综合婷婷欧美综合| 黄色av网站免费在线| 亚洲综合另类精品小说| 清纯美女在线观看国产| 521精品视频在线观看| 在线视频国产欧美日韩| 狠狠躁狠狠爱网站视频| 家庭女教师中文字幕在线播放| 天天射,天天操,天天说| 日本真人性生活视频免费看| 91 亚洲视频在线观看| 国产又粗又黄又硬又爽| 亚洲麻豆一区二区三区| 日本韩国在线观看一区二区| 91免费福利网91麻豆国产精品| 91九色国产熟女一区二区| 一个色综合男人天堂| 懂色av蜜桃a v| 亚洲Av无码国产综合色区| 午夜av一区二区三区| 视频一区二区综合精品| 日韩写真福利视频在线观看| 青青操免费日综合视频观看| 亚洲va天堂va国产va久| 91精品国产黑色丝袜| 一本一本久久a久久精品综合不卡| 国产乱子伦精品视频潮优女| 亚洲护士一区二区三区| 欧美一级色视频美日韩| 天天日天天日天天擦| 孕妇奶水仑乱A级毛片免费看| 大胆亚洲av日韩av| 在线观看成人国产电影| 一级黄片久久久久久久久| 国产视频网站国产视频| 国产妇女自拍区在线观看| 91国内精品自线在拍白富美| 午夜毛片不卡免费观看视频| 久久久久久久久久性潮| 亚洲午夜福利中文乱码字幕| 国产麻豆剧传媒精品国产av蜜桃| 日本中文字幕一二区视频| 首之国产AV医生和护士小芳| 国产第一美女一区二区三区四区 | 亚洲中文字幕校园春色| 亚洲欧美激情国产综合久久久| 狠狠地躁夜夜躁日日躁| 爱爱免费在线观看视频| 亚洲成人精品女人久久久| 日韩一区二区电国产精品| 国产熟妇一区二区三区av| 无码精品一区二区三区人| 乱亲女秽乱长久久久| 精品国产亚洲av一淫| 91免费黄片可看视频| 91人妻精品一区二区在线看| AV天堂一区二区免费试看| 97瑟瑟超碰在线香蕉| 成人精品在线观看视频| 丝袜长腿第一页在线| 538精品在线观看视频| 成人高清在线观看视频| 国产黑丝高跟鞋视频在线播放| 蜜桃专区一区二区在线观看| 美女张开两腿让男人桶av| nagger可以指黑人吗| av一本二本在线观看| 久久这里只有精彩视频免费| 亚洲成人精品女人久久久| 亚洲av日韩高清hd| 极品性荡少妇一区二区色欲| 亚洲午夜电影之麻豆| 成年女人免费播放视频| 亚洲推理片免费看网站| 国产白嫩美女一区二区| 午夜场射精嗯嗯啊啊视频| 国产一区二区久久久裸臀| 国产麻豆精品人妻av| 色婷婷六月亚洲综合香蕉| 播放日本一区二区三区电影| 水蜜桃国产一区二区三区| 国产午夜男女爽爽爽爽爽视频| 欧美在线一二三视频| 亚洲1069综合男同| 粉嫩小穴流水视频在线观看| 欧美va亚洲va天堂va| 2018最新中文字幕在线观看| 欧美精产国品一二三产品区别大吗| 精品久久婷婷免费视频| 天天做天天干天天操天天射| 熟女人妻在线观看视频| 精品suv一区二区69| 精品一区二区三区午夜| 国产麻豆国语对白露脸剧情| 这里有精品成人国产99| 国产精品中文av在线播放 | 午夜精品一区二区三区更新| 亚洲久久午夜av一区二区| 老熟妇凹凸淫老妇女av在线观看| 日本女人一级免费片| 一区二区在线观看少妇| 午夜激情久久不卡一区二区| 欧美一区二区三区激情啪啪啪| mm131美女午夜爽爽爽| 不卡一区一区三区在线| 性生活第二下硬不起来| 天天色天天舔天天射天天爽| 日本一道二三区视频久久| 久久久精品欧洲亚洲av| 国产普通话插插视频| 亚洲免费国产在线日韩| 亚洲一区二区三区偷拍女厕91| 国产精品入口麻豆啊啊啊| 亚洲福利精品福利精品福利| 久久久久五月天丁香社区| 欧美精品国产综合久久| 偷拍自拍视频图片免费| 国产精品女邻居小骚货| 久精品人妻一区二区三区| 国产精品中文av在线播放 | 日韩一个色综合导航| 黄色成人在线中文字幕| 天天干天天插天天谢| 91av精品视频在线| 国产在线拍揄自揄视频网站| 亚洲熟女久久久36d| 大陆胖女人与丈夫操b国语高清| 青娱乐蜜桃臀av色| 免费十精品十国产网站| 99国内小视频在现欢看| 亚洲国产欧美一区二区丝袜黑人| 一区二区视频在线观看免费观看| 欧美日本在线观看一区二区| 2018在线福利视频| 在线免费观看黄页视频| 色秀欧美视频第一页| 老鸭窝日韩精品视频观看| 精品高跟鞋丝袜一区二区| 丝袜美腿视频诱惑亚洲无| 福利国产视频在线观看| 亚洲伊人av天堂有码在线| 中文字幕在线免费第一页| 国产精品自偷自拍啪啪啪| 亚洲成人线上免费视频观看| 日韩特级黄片高清在线看| 久久精品久久精品亚洲人| 久久综合老鸭窝色综合久久| 红桃av成人在线观看| jiujiure精品视频在线| 日韩欧美在线观看不卡一区二区| 99av国产精品欲麻豆| 天天操,天天干,天天射| AV天堂一区二区免费试看| 国产真实乱子伦a视频 | 9l人妻人人爽人人爽| 亚洲天天干 夜夜操| 北条麻妃肉色丝袜视频| 一个人免费在线观看ww视频| 天天日天天玩天天摸| 一区二区视频在线观看视频在线| 午夜在线观看一区视频| 99久久99久国产黄毛片| 亚洲精品午夜aaa久久| 欧美一级视频一区二区| 亚洲人妻视频在线网| 国产精品黄页网站视频| 欧美第一页在线免费观看视频| 天天草天天色天天干| 国产一区二区在线欧美| 国产精彩对白一区二区三区| 久草福利电影在线观看| 亚洲成人黄色一区二区三区| 日韩加勒比东京热二区| 成人蜜桃美臀九一一区二区三区| 欧美精品中文字幕久久二区| 98精产国品一二三产区区别| 巨乳人妻日下部加奈被邻居中出 | av在线播放国产不卡| 久久久精品999精品日本| 欧美成人综合色在线噜噜| 日本一道二三区视频久久| 日韩av大胆在线观看| 亚洲国产精品黑丝美女| 韩国爱爱视频中文字幕| 国产又色又刺激在线视频| 自拍 日韩 欧美激情| 欧美一区二区中文字幕电影| 超级碰碰在线视频免费观看| 欧美日韩在线精品一区二区三| 大鸡巴操b视频在线| 直接观看免费黄网站| 欧美日本国产自视大全| 色爱av一区二区三区| 自拍偷拍vs一区二区三区| 欧美viboss性丰满| 亚洲av无码成人精品区辽| 亚洲国产第一页在线观看| 国产美女精品福利在线| 91国语爽死我了不卡| 国产视频网站国产视频| 欧美久久久久久三级网| 97资源人妻免费在线视频| 成人国产激情自拍三区| 大屁股肉感人妻中文字幕在线| 啊慢点鸡巴太大了啊舒服视频| 久久丁香婷婷六月天| 色爱av一区二区三区| 中文字幕乱码人妻电影| 最新日韩av传媒在线| 亚洲欧洲av天堂综合| 久久精品美女免费视频| 伊人成人综合开心网| 亚洲日产av一区二区在线| 91片黄在线观看喷潮| 欧美一区二区三区啪啪同性| 亚洲国产在线精品国偷产拍| 色婷婷六月亚洲综合香蕉| 青春草视频在线免费播放| 97精品视频在线观看| 爆乳骚货内射骚货内射在线 | 亚洲精品高清自拍av| 女同互舔一区二区三区| 成年人的在线免费视频| 欧美精品黑人性xxxx| 无套猛戳丰满少妇人妻| 亚洲av一妻不如妾| 日本真人性生活视频免费看| 久久久久久久一区二区三| 18禁网站一区二区三区四区| 欲乱人妻少妇在线视频裸| 超级福利视频在线观看| 欧美精品免费aaaaaa| 不卡精品视频在线观看| 亚洲 中文 自拍 另类 欧美| 日韩精品激情在线观看| 日本女人一级免费片| 黄色成年网站午夜在线观看| 精品91自产拍在线观看一区| 啪啪啪啪啪啪啪啪啪啪黄色| 风流唐伯虎电视剧在线观看| 亚洲国产在线精品国偷产拍| 国产 在线 免费 精品| 国产精品人妻66p| 日韩av熟妇在线观看| 亚洲va天堂va国产va久| 亚洲精品午夜久久久久| 国产欧美日韩第三页| 欧美精品国产综合久久| 亚洲综合色在线免费观看| 91精品啪在线免费| 久久久噜噜噜久久熟女av| 美女小视频网站在线| 国产精品久久久久国产三级试频 | 欧美色呦呦最新网址| 在线免费观看黄页视频| 在线播放国产黄色av| 91传媒一区二区三区| 色吉吉影音天天干天天操| 色在线观看视频免费的| 免费在线观看视频啪啪| 国产精品视频资源在线播放| 成人国产影院在线观看| 亚洲免费va在线播放| caoporn蜜桃视频| 午夜91一区二区三区| 亚洲成高清a人片在线观看| 一区二区三区四区五区性感视频| 日韩av有码一区二区三区4| 曰本无码人妻丰满熟妇啪啪| av视网站在线观看| 一二三中文乱码亚洲乱码one| 亚洲熟女综合色一区二区三区四区| 91精品啪在线免费| 日本在线不卡免费视频| 不卡一区一区三区在线| 久久精品美女免费视频| 搡老熟女一区二区在线观看| 亚洲精品色在线观看视频| 人妻激情图片视频小说| 一区二区久久成人网| 视频一区二区在线免费播放| 中文字幕亚洲中文字幕| 天堂中文字幕翔田av| av大全在线播放免费| 91超碰青青中文字幕| 清纯美女在线观看国产| 国产精品入口麻豆啊啊啊| 天天干天天啪天天舔| 国产精品一二三不卡带免费视频 | 国产乱弄免费视频观看| 亚洲中文字幕乱码区| 日韩av熟妇在线观看| av成人在线观看一区| 999热精品视频在线| 含骚鸡巴玩逼逼视频| 天天射,天天操,天天说| 日本高清撒尿pissing| 老熟妇凹凸淫老妇女av在线观看| 亚洲激情偷拍一区二区| 91精品资源免费观看| 精品国产乱码一区二区三区乱| 精品91高清在线观看| 在线制服丝袜中文字幕| 色婷婷精品大在线观看| 婷婷六月天中文字幕| 日美女屁股黄邑视频| 天天射夜夜操狠狠干| 黑人3p华裔熟女普通话| 亚洲中文字幕国产日韩| 亚洲麻豆一区二区三区| 中文字日产幕乱六区蜜桃| 精品久久久久久久久久久99| 精品高潮呻吟久久av| 国产乱子伦一二三区| 中文字幕奴隷色的舞台50| 午夜精品一区二区三区福利视频| jiuse91九色视频| 伊人情人综合成人久久网小说| 一区二区视频在线观看视频在线| 在线播放国产黄色av| 51国产偷自视频在线播放| 在线免费视频 自拍| 少妇一区二区三区久久久| 亚洲熟妇x久久av久久| 国产精品人妻熟女毛片av久| 天天干天天日天天干天天操| 韩国爱爱视频中文字幕| 91国偷自产一区二区三区精品| 黄片三级三级三级在线观看| 年轻的人妻被夫上司侵犯| 精品一区二区三区三区88 | 午夜福利资源综合激情午夜福利资| 顶级尤物粉嫩小尤物网站| 国产亚洲欧美45p| 欧洲日韩亚洲一区二区三区| 亚洲国产精品免费在线观看| 在线免费观看国产精品黄色| 欧美日韩高清午夜蜜桃大香蕉| 动漫黑丝美女的鸡巴| 少妇高潮无套内谢麻豆| 国产精品黄页网站视频| 日本丰满熟妇大屁股久久| 激情色图一区二区三区| 福利一二三在线视频观看| 最新91九色国产在线观看| 99久久激情婷婷综合五月天| 天天躁日日躁狠狠躁av麻豆| 999九九久久久精品| 99国内精品永久免费视频| 亚洲熟色妇av日韩熟色妇在线| 国产女人露脸高潮对白视频| 一区二区三区四区五区性感视频 | 人人妻人人人操人人人爽| 五月婷婷在线观看视频免费| 性色蜜臀av一区二区三区| www日韩毛片av| 秋霞午夜av福利经典影视| 天天干天天啪天天舔| 和邻居少妇愉情中文字幕| 天天色天天操天天透| 国产三级影院在线观看| 欧美aa一级一区三区四区| 国产精品三级三级三级| 久久永久免费精品人妻专区| 超pen在线观看视频公开97| 在线新三级黄伊人网| www天堂在线久久| 中文字幕 亚洲av| 亚洲午夜精品小视频| 自拍偷拍vs一区二区三区| 999久久久久999| 久精品人妻一区二区三区| 在线观看免费av网址大全| 亚洲青青操骚货在线视频| 久久精品国产亚洲精品166m| 亚洲熟妇无码一区二区三区| 偷拍自拍亚洲美腿丝袜| 精品国产午夜视频一区二区| 北条麻妃肉色丝袜视频| 国产揄拍高清国内精品对白| 91精品免费久久久久久| 天天操天天操天天碰| 男生用鸡操女生视频动漫| 黑人借宿ntr人妻的沦陷2| av线天堂在线观看| 国产精品亚洲а∨天堂免| 综合一区二区三区蜜臀| a v欧美一区=区三区| 成年美女黄网站18禁久久| 黄色片年轻人在线观看| 男生舔女生逼逼视频| 日韩北条麻妃一区在线| 黄色大片男人操女人逼| 不卡一区一区三区在线| 亚洲老熟妇日本老妇| 国产性生活中老年人视频网站| av大全在线播放免费| 日韩精品中文字幕福利| 91人妻精品久久久久久久网站 | 成年人黄视频在线观看| 亚洲中文精品人人免费| 香蕉片在线观看av| 无码中文字幕波多野不卡| 男人天堂最新地址av| 成人动漫大肉棒插进去视频| 91中文字幕免费在线观看| 制服丝袜在线人妻中文字幕| 国产91嫩草久久成人在线视频| 欧洲日韩亚洲一区二区三区| 97人人模人人爽人人喊| 97人妻色免费视频| 日本性感美女三级视频| 六月婷婷激情一区二区三区| 美女福利视频导航网站| 中文字幕在线观看国产片| 久久艹在线观看视频| 成人区人妻精品一区二视频| 色天天天天射天天舔| 欧美激情精品在线观看| 中文字幕人妻熟女在线电影| 最新中文字幕免费视频| 在线观看的黄色免费网站| 少妇露脸深喉口爆吞精| 亚洲粉嫩av一区二区三区| 在线免费观看亚洲精品电影| av新中文天堂在线网址| 国产一区av澳门在线观看| 亚洲粉嫩av一区二区三区| 一区二区三区另类在线| 中文字幕第三十八页久久 | 久久久久久九九99精品| 欧美乱妇无乱码一区二区| 999九九久久久精品| 99精品国产aⅴ在线观看| 99久久成人日韩欧美精品| 91福利在线视频免费观看| av成人在线观看一区| 国产精品成久久久久三级蜜臀av| 高潮视频在线快速观看国家快速 | xxx日本hd高清| nagger可以指黑人吗| 亚洲欧美人精品高清| 老司机免费福利视频网| 自拍偷拍一区二区三区图片| 国产日韩精品一二三区久久久| 淫秽激情视频免费观看| 在线视频国产欧美日韩| 人妻久久久精品69系列| 日韩精品电影亚洲一区| 中文字幕人妻一区二区视频| 深田咏美亚洲一区二区| 在线观看视频 你懂的| 国产精品成人xxxx| 91人妻精品一区二区在线看| 亚洲综合在线观看免费| 十八禁在线观看地址免费| 天天干狠狠干天天操 | 亚洲黄色av网站免费播放| 大胆亚洲av日韩av| 亚洲成人线上免费视频观看| 日本特级片中文字幕| 又粗又硬又猛又爽又黄的| 亚洲高清国产自产av| 精彩视频99免费在线| 精品久久久久久久久久久99| 天天日夜夜干天天操| 青青热久免费精品视频在线观看| 国产在线自在拍91国语自产精品| 人妻丰满熟妇综合网| 在线观看免费视频色97| 毛片一级完整版免费| 国产变态另类在线观看| 久久精品亚洲国产av香蕉| 日韩精品二区一区久久| 亚洲特黄aaaa片| 插逼视频双插洞国产操逼插洞| 成人免费公开视频无毒| 啪啪啪啪啪啪啪啪av| 天天色天天操天天舔| chinese国产盗摄一区二区 | 91中文字幕免费在线观看| 天天日天天天天天天天天天天 | av黄色成人在线观看| 天天日天天日天天射天天干| 成熟熟女国产精品一区| 99热99这里精品6国产| 亚洲福利天堂久久久久久| 日韩亚洲高清在线观看| 懂色av蜜桃a v| 国产乱弄免费视频观看| 蜜桃视频17c在线一区二区| 欧美亚洲少妇福利视频| 一区二区三区的久久的蜜桃的视频| 亚洲精品无码久久久久不卡| 久久久久久99国产精品| 不卡日韩av在线观看| 成人精品在线观看视频| 欧美亚洲牲夜夜综合久久| 98视频精品在线观看| 顶级尤物粉嫩小尤物网站| 成人蜜桃美臀九一一区二区三区| 国产精品久久久久国产三级试频| 亚洲欧美激情国产综合久久久| 青青社区2国产视频| 在线免费观看视频一二区| 国产在线一区二区三区麻酥酥| 青青色国产视频在线| 制服丝袜在线人妻中文字幕| 国产精品免费不卡av| 99re国产在线精品| 成人av免费不卡在线观看| 国产极品美女久久久久久| 一区二区三区日本伦理| av在线shipin| 少妇人妻真实精品视频| 无忧传媒在线观看视频| 大肉大捧一进一出好爽在线视频| 青青色国产视频在线| 中文字幕在线乱码一区二区| 伊人网中文字幕在线视频| 国产精品视频一区在线播放| brazzers欧熟精品系列| 看一级特黄a大片日本片黑人| 亚洲国产成人av在线一区| 人妻无码中文字幕专区| 久久久久久久久久久免费女人| 午夜精品久久久久麻豆影视| 国产自拍在线观看成人| 欧美精品国产综合久久| 亚洲av色香蕉一区二区三区 | 亚洲一区自拍高清免费视频| 97超碰人人搞人人| 久久这里有免费精品| 日本女大学生的黄色小视频| 欧美日韩精品永久免费网址| 亚洲综合色在线免费观看| 日本一区精品视频在线观看| 最新91九色国产在线观看| 国产又粗又猛又爽又黄的视频在线| 精品久久久久久久久久中文蒉| 91啪国自产中文字幕在线| 久久久久只精品国产三级| 被大鸡吧操的好舒服视频免费| 一区二区三区的久久的蜜桃的视频| 人妻少妇亚洲精品中文字幕| 黄色男人的天堂视频| 国产亚洲精品欧洲在线观看| 93精品视频在线观看| 青青青青青免费视频| 国产麻豆精品人妻av| 亚洲成人黄色一区二区三区| xxx日本hd高清| 男人插女人视频网站| 同居了嫂子在线播高清中文| 亚洲黄色av网站免费播放| 人人妻人人爱人人草| 狠狠的往里顶撞h百合| 人人妻人人爽人人添夜| 亚洲精品福利网站图片| 日本一二三中文字幕| 亚洲精品高清自拍av| 狠狠躁夜夜躁人人爽天天久天啪| 日韩三级电影华丽的外出| 国产亚洲欧美另类在线观看| 亚洲嫩模一区二区三区| 日日日日日日日日夜夜夜夜夜夜| 成年女人免费播放视频| 国产精品久久久黄网站| 日韩近亲视频在线观看| 黑人解禁人妻叶爱071| 青青青青青青青在线播放视频| 岛国一区二区三区视频在线| 白嫩白嫩美女极品国产在线观看| 日本黄色三级高清视频| 日本一本午夜在线播放| 欧美视频一区免费在线| 国产亚洲欧美另类在线观看| 在线免费91激情四射| 天干天天天色天天日天天射| 97精品人妻一区二区三区精品| 91‖亚洲‖国产熟女| 蜜桃色婷婷久久久福利在线| 麻豆精品成人免费视频| 亚洲女人的天堂av| 日本人妻欲求不满中文字幕| 国产成人自拍视频播放| 久久久人妻一区二区| 国产极品美女久久久久久| 久久精品视频一区二区三区四区| 亚洲精品亚洲人成在线导航| 亚洲国产成人在线一区| 夜夜躁狠狠躁日日躁麻豆内射 | 久久综合老鸭窝色综合久久| 宅男噜噜噜666国产| 色爱av一区二区三区| 午夜的视频在线观看| 国产在线91观看免费观看| 久久久久久久久久久免费女人| 一区二区三区 自拍偷拍| 亚洲伊人av天堂有码在线| 国产熟妇乱妇熟色T区| 天天爽夜夜爽人人爽QC| 不卡一区一区三区在线| 都市家庭人妻激情自拍视频| 日本免费午夜视频网站| 亚洲国产最大av综合| 二区中出在线观看老师 | 天天操夜夜骑日日摸| 国产男女视频在线播放| 最近中文字幕国产在线| 亚洲高清一区二区三区视频在线| 国产精品熟女久久久久浪潮| 可以免费看的www视频你懂的| 中文字幕人妻熟女在线电影| 国产中文精品在线观看| 免费大片在线观看视频网站| 不戴胸罩引我诱的隔壁的人妻| 日韩影片一区二区三区不卡免费| 五月天色婷婷在线观看视频免费| 成人av天堂丝袜在线观看| 91大神福利视频网| 99国内精品永久免费视频| 日韩精品中文字幕福利| 在线观看成人国产电影| 爱有来生高清在线中文字幕| 视频二区在线视频观看| av在线播放国产不卡| 成人影片高清在线观看| 在线视频免费观看网| 综合国产成人在线观看| 91精品一区二区三区站长推荐| 亚洲人妻av毛片在线| 大肉大捧一进一出好爽在线视频 | 天天想要天天操天天干| 亚洲国产香蕉视频在线播放| 中文字幕av第1页中文字幕| 人妻另类专区欧美制服| 国产午夜亚洲精品麻豆| 日韩成人免费电影二区| 成人国产小视频在线观看| 精品国产亚洲av一淫| 99久久超碰人妻国产| 青青青激情在线观看视频| 国产视频一区在线观看| 男大肉棒猛烈插女免费视频| 91久久人澡人人添人人爽乱| 久久久超爽一二三av| 在线国产中文字幕视频| 亚洲高清免费在线观看视频| 久精品人妻一区二区三区| 亚洲天天干 夜夜操| 亚洲免费视频欧洲免费视频 | 在线观看视频 你懂的| 亚洲视频乱码在线观看| 狠狠嗨日韩综合久久| 日本少妇精品免费视频| 馒头大胆亚洲一区二区| 果冻传媒av一区二区三区| 久久热这里这里只有精品| 五月天中文字幕内射| 天天操天天插天天色| 国产卡一卡二卡三乱码手机| 韩国黄色一级二级三级| 91九色国产熟女一区二区| 国产无遮挡裸体免费直播视频| 激情内射在线免费观看| 98视频精品在线观看| 日本a级视频老女人| 91精品视频在线观看免费| 偷拍自拍亚洲视频在线观看| 熟女人妻在线观看视频| 国产成人精品一区在线观看| 欧美精品中文字幕久久二区| 亚洲 国产 成人 在线| 日韩少妇人妻精品无码专区| 中文字幕日韩人妻在线三区| 美女张开腿让男生操在线看| 亚洲图片偷拍自拍区| 在线免费观看靠比视频的网站| 日本裸体熟妇区二区欧美| 亚洲av日韩高清hd| 天天射夜夜操狠狠干| 国产一级精品综合av| 国产1区,2区,3区| 日本a级视频老女人| 亚洲av黄色在线网站| 天天操天天干天天插| 欧美3p在线观看一区二区三区| 午夜国产免费福利av| 成人av天堂丝袜在线观看| 免费啪啪啪在线观看视频| 亚洲综合另类欧美久久| 国产大鸡巴大鸡巴操小骚逼小骚逼| 人妻丝袜av在线播放网址| 青青青视频自偷自拍38碰| 老司机你懂得福利视频| 久久久制服丝袜中文字幕| 亚洲自拍偷拍综合色| 中文字幕在线观看极品视频| 懂色av之国产精品| 亚洲精品久久综合久| 在线免费观看日本片| 高潮喷水在线视频观看| 亚洲av色图18p| 五十路熟女人妻一区二区9933| 夫妻在线观看视频91| 91精品国产综合久久久蜜| 国产亚洲视频在线二区| 中国视频一区二区三区| 中文乱理伦片在线观看| 天天日天天玩天天摸| 桃色视频在线观看一区二区| 91免费放福利在线观看| 欧美日本在线观看一区二区| 一本久久精品一区二区| 涩涩的视频在线观看视频| 一级黄片大鸡巴插入美女| 888亚洲欧美国产va在线播放| 抽查舔水白紧大视频| 一区二区三区的久久的蜜桃的视频| 一区二区三区在线视频福利| 一个色综合男人天堂| 日本精品美女在线观看| 欧美日本在线视频一区| 亚洲国产成人av在线一区| 中文 成人 在线 视频| 青青在线视频性感少妇和隔壁黑丝| 久久亚洲天堂中文对白| 在线制服丝袜中文字幕| 成人色综合中文字幕| 综合国产成人在线观看| huangse网站在线观看| 特大黑人巨大xxxx| 91成人精品亚洲国产| 青青青青草手机在线视频免费看| 日曰摸日日碰夜夜爽歪歪| 久久精品久久精品亚洲人| 91精品国产91青青碰| 一区二区三区激情在线| 中文人妻AV久久人妻水| 精品一区二区三区欧美| 亚洲欧美激情人妻偷拍| 国产三级影院在线观看| 91色秘乱一区二区三区| 任你操任你干精品在线视频| 欧美精品国产综合久久| 1769国产精品视频免费观看| 中文字幕中文字幕人妻| 中国熟女@视频91| 青青青激情在线观看视频| 我想看操逼黄色大片| 亚洲日产av一区二区在线| 久久久精品999精品日本 | 欧美亚洲少妇福利视频| 国产精品精品精品999| 天堂av在线最新版在线| 日韩国产乱码中文字幕| 端庄人妻堕落挣扎沉沦| jiujiure精品视频在线| 五月天色婷婷在线观看视频免费| 青青色国产视频在线| 夜色福利视频在线观看| 91欧美在线免费观看| 国产黄色片蝌蚪九色91| 国产精品亚洲а∨天堂免| 亚洲欧美日韩视频免费观看| 在线免费观看国产精品黄色| 91亚洲精品干熟女蜜桃频道| 全国亚洲男人的天堂| 2018最新中文字幕在线观看| 国产一区二区久久久裸臀| 狠狠鲁狠狠操天天晚上干干| 久久久久久性虐视频| 青娱乐在线免费视频盛宴 | 护士特殊服务久久久久久久| 国产乱子伦一二三区| 亚洲中文字幕国产日韩| 成人乱码一区二区三区av| 日本又色又爽又黄又粗| 久久久久久久精品成人热| 在线观看免费av网址大全| 93视频一区二区三区| 亚洲av无乱一区二区三区性色| 国产三级影院在线观看| 老司机你懂得福利视频| 偷拍自拍福利视频在线观看| 大鸡吧插逼逼视频免费看| 丝袜美腿视频诱惑亚洲无| 久久国产精品精品美女| 婷婷色中文亚洲网68| 中文字幕在线乱码一区二区| 中文字幕在线观看国产片| 久久这里只有精品热视频| av日韩在线免费播放| 国产janese在线播放| 亚洲精品午夜久久久久| 毛片av在线免费看| 啪啪啪啪啪啪啪啪av| 熟女少妇激情五十路| 自拍偷拍亚洲精品第2页| 国产一区成人在线观看视频 | 综合国产成人在线观看| 亚洲伊人久久精品影院一美女洗澡| 免费在线播放a级片| 亚洲码av无色中文| 国产精品探花熟女在线观看| 青娱乐极品视频青青草| av黄色成人在线观看| 天天操天天干天天日狠狠插| 国产无遮挡裸体免费直播视频| 99视频精品全部15| 欧美一级色视频美日韩| 男女啪啪视频免费在线观看| 成人色综合中文字幕| 亚洲精品麻豆免费在线观看| 适合午夜一个人看的视频| 久久久久久9999久久久久| 午夜在线一区二区免费| 夜鲁夜鲁狠鲁天天在线| 亚洲视频乱码在线观看| 亚洲午夜电影在线观看| 婷婷久久一区二区字幕网址你懂得 | 亚洲人成精品久久久久久久| 国产成人无码精品久久久电影| 人妻在线精品录音叫床| 欧美一区二区中文字幕电影 | 日本精品视频不卡一二三| 亚洲男人让女人爽的视频| 亚洲综合一区二区精品久久| 天天干夜夜操天天舔| 亚洲精品欧美日韩在线播放| 天天操天天干天天艹| jiujiure精品视频在线| 特一级特级黄色网片| 亚洲午夜福利中文乱码字幕| mm131美女午夜爽爽爽| 最新国产精品网址在线观看| 欧美爆乳肉感大码在线观看| weyvv5国产成人精品的视频| 国产精彩对白一区二区三区 | 天天色天天操天天舔| 欧洲黄页网免费观看| 天天操天天爽天天干| 黑人借宿ntr人妻的沦陷2| 性感美女福利视频网站| 亚洲中文精品人人免费| 日韩二区视频一线天婷婷五| 青青青青青青青青青国产精品视频| 久久精品美女免费视频| 在线视频精品你懂的| 亚欧在线视频你懂的| 中国黄片视频一区91| 喷水视频在线观看这里只有精品 | 欧美偷拍自拍色图片| 亚洲的电影一区二区三区| 国产片免费观看在线观看| 任你操视频免费在线观看| asmr福利视频在线观看| 爆乳骚货内射骚货内射在线 | 国产不卡av在线免费| 亚洲国产精品中文字幕网站| 国产福利在线视频一区| 欧美精品欧美极品欧美视频 | 女人精品内射国产99| 天天操天天爽天天干| 51精品视频免费在线观看| 国产综合精品久久久久蜜臀| 久久国产精品精品美女| 天天摸天天日天天操| 国产精品午夜国产小视频| 天天干天天日天天干天天操| 黑人巨大精品欧美视频| 久久久久久cao我的性感人妻| 青春草视频在线免费播放| 日本人妻精品久久久久久| 成人av电影免费版| 韩国三级aaaaa高清视频| 中国产一级黄片免费视频播放| 一区二区在线视频中文字幕| 中文字幕av第1页中文字幕| 91大屁股国产一区二区| 国产一线二线三线的区别在哪| 中文 成人 在线 视频| 久久久久久9999久久久久| 人妻久久无码中文成人| 欧美天堂av无线av欧美| 国产实拍勾搭女技师av在线| 免费在线黄色观看网站| 中国熟女一区二区性xx| 亚洲精品三级av在线免费观看| 亚洲av色香蕉一区二区三区| 亚洲一级特黄特黄黄色录像片| 国产又色又刺激在线视频| 99热久久这里只有精品8| chinese国产盗摄一区二区| 日韩精品中文字幕在线| 中文字幕欧美日韩射射一| 国产精品入口麻豆啊啊啊| 大鸡吧插逼逼视频免费看| 中文字日产幕乱六区蜜桃| 色av色婷婷人妻久久久精品高清 | 成年美女黄网站18禁久久| 五十路av熟女松本翔子| 狠狠操狠狠操免费视频| 亚洲特黄aaaa片| 国产精品手机在线看片| 插小穴高清无码中文字幕| 在线免费观看日本伦理| 99热99re在线播放| 一区二区视频视频视频| 日本乱人一区二区三区| 精彩视频99免费在线| 亚洲精品乱码久久久本| 中文字幕人妻被公上司喝醉在线| 青青青爽视频在线播放| 啪啪啪18禁一区二区三区| 欧美精品欧美极品欧美视频| 欧美女同性恋免费a| 亚洲中文字幕综合小综合| 青青草人人妻人人妻| 亚洲中文字幕国产日韩| 精品成人午夜免费看| 女生自摸在线观看一区二区三区 | 亚洲偷自拍高清视频| 亚洲一区二区三区精品视频在线 | 日本人妻欲求不满中文字幕| 熟女91pooyn熟女| 中文字幕欧美日韩射射一| 青青色国产视频在线| 丰满的继坶3中文在线观看| 一区二区三区蜜臀在线| 9l人妻人人爽人人爽| 免费av岛国天堂网站| 日本午夜久久女同精女女| 久久精品在线观看一区二区| 国产chinesehd精品麻豆| 精品黑人一区二区三区久久国产 | 男生舔女生逼逼视频| 91福利视频免费在线观看| 亚洲av日韩精品久久久| 精品少妇一二三视频在线| 国产亚洲四十路五十路| 夜女神免费福利视频| 最近中文字幕国产在线| av天堂加勒比在线| 天堂av在线播放免费| 一区二区三区激情在线| 亚洲精品麻豆免费在线观看| 国产精品久久久黄网站| 97年大学生大白天操逼| 人妻少妇亚洲一区二区| 日韩欧美国产一区不卡| 久久亚洲天堂中文对白| 天天干天天操天天插天天日| 欧美黑人性猛交xxxxⅹooo| 精品国产亚洲av一淫| 99热色原网这里只有精品| 亚洲欧美国产麻豆综合| 91综合久久亚洲综合| 精品一区二区三四区| 亚洲在线免费h观看网站| 欧美伊人久久大香线蕉综合| 91久久国产成人免费网站| 国产伊人免费在线播放| 天天日天天添天天爽| 女同性ⅹxx女同h偷拍| 大陆av手机在线观看| 经典亚洲伊人第一页| 91精品一区二区三区站长推荐| 欧美80老妇人性视频| 日本少妇人妻xxxxx18| 亚洲国产第一页在线观看| 成年人免费看在线视频| 中文字幕av熟女人妻| 在线观看av观看av| 后入美女人妻高清在线| 亚洲中文字幕综合小综合| 国产精品一区二区久久久av| 欧美亚洲偷拍自拍色图| 中英文字幕av一区| 狠狠躁夜夜躁人人爽天天久天啪| 一区二区三区久久中文字幕| 午夜成午夜成年片在线观看 | 成熟熟女国产精品一区| 久久久精品精品视频视频| aiss午夜免费视频| 999九九久久久精品| 成人精品视频99第一页| 亚洲中文字幕综合小综合| 亚洲免费国产在线日韩| 91九色国产熟女一区二区| 97人妻人人澡爽人人精品| 国内自拍第一页在线观看| 国产女人被做到高潮免费视频| 99热99re在线播放| 国产精选一区在线播放| 天天操天天干天天艹| 漂亮 人妻被中出中文| 91在线免费观看成人| 亚洲人人妻一区二区三区| 国产高潮无码喷水AV片在线观看 | yellow在线播放av啊啊啊| av天堂中文免费在线| 亚洲天堂第一页中文字幕 | 黄色资源视频网站日韩| 不卡日韩av在线观看| 91免费观看在线网站| 不戴胸罩引我诱的隔壁的人妻| 免费成人av中文字幕| 啪啪啪啪啪啪啪免费视频| 91‖亚洲‖国产熟女| 国产综合高清在线观看| 啊啊啊想要被插进去视频| 亚洲免费国产在线日韩| 搡老熟女一区二区在线观看| 毛片一级完整版免费| 欧美80老妇人性视频| 黑人大几巴狂插日本少妇| 亚洲国产在人线放午夜| 亚洲午夜电影在线观看| 91国内精品久久久久精品一| 久久热久久视频在线观看| 成人区人妻精品一区二视频| 大香蕉日本伊人中文在线| 亚洲美女美妇久久字幕组| 亚洲av色图18p| 国产丰满熟女成人视频| 曰本无码人妻丰满熟妇啪啪| 精品91自产拍在线观看一区| 国产精品久久久久久久女人18| 日本免费午夜视频网站| 韩国AV无码不卡在线播放| 国产精品久久久久久久精品视频| 欧美aa一级一区三区四区| 男女啪啪视频免费在线观看| 青青青青草手机在线视频免费看 | 老司机免费福利视频网| 97国产在线av精品| 欧美专区日韩专区国产专区| 最新欧美一二三视频| 男人的网址你懂的亚洲欧洲av| 亚洲欧美激情中文字幕| 99热国产精品666| 中文字幕最新久久久| 91老熟女连续高潮对白| 国产精品成久久久久三级蜜臀av| 精品国产污污免费网站入口自| 亚洲午夜电影在线观看| 中文字幕免费福利视频6| 红桃av成人在线观看| 欧洲国产成人精品91铁牛tv | 自拍偷拍日韩欧美亚洲| 3D动漫精品啪啪一区二区下载| 日韩欧美国产一区ab| 夜夜躁狠狠躁日日躁麻豆内射 | 亚洲一区二区三区五区| 久草极品美女视频在线观看| 日本高清成人一区二区三区| 亚洲一级av大片免费观看| 国产日韩精品免费在线| 大鸡巴插入美女黑黑的阴毛| aaa久久久久久久久| 国产在线观看黄色视频| 成人综合亚洲欧美一区| 国产高清女主播在线| 国产午夜福利av导航| 老鸭窝日韩精品视频观看| 人妻丝袜精品中文字幕| 亚洲av一妻不如妾| 极品性荡少妇一区二区色欲| av一本二本在线观看| 性色蜜臀av一区二区三区| 黄色片年轻人在线观看| 扒开腿挺进肉嫩小18禁视频| 色花堂在线av中文字幕九九| 亚洲精品午夜aaa久久| 中文字幕无码一区二区免费| 欧美一区二区三区高清不卡tv| japanese日本熟妇另类| 91快播视频在线观看| 日韩影片一区二区三区不卡免费| 国产高潮无码喷水AV片在线观看| 色综合色综合色综合色| 熟女俱乐部一二三区| 2021天天色天天干| 欧美爆乳肉感大码在线观看| 91精品视频在线观看免费| 天天综合天天综合天天网| 经典av尤物一区二区| 91精品国产黑色丝袜| 久久久久久久一区二区三| 岛国一区二区三区视频在线| 少妇人妻久久久久视频黄片| 一级黄片久久久久久久久| nagger可以指黑人吗| 18禁美女羞羞免费网站| 国产激情av网站在线观看| 青青色国产视频在线| 日本少妇的秘密免费视频| 欧美成一区二区三区四区| 五十路人妻熟女av一区二区| sspd152中文字幕在线| 免费观看污视频网站| 亚洲护士一区二区三区| AV天堂一区二区免费试看| 一级黄片大鸡巴插入美女| 2021年国产精品自拍| 天天操天天干天天艹| 亚洲的电影一区二区三区| 中国视频一区二区三区| 日本性感美女写真视频| 97年大学生大白天操逼| 视频久久久久久久人妻| 国产福利在线视频一区| 91精品免费久久久久久| 亚洲免费视频欧洲免费视频| 久久99久久99精品影院| 久草视频首页在线观看| 中文字幕日韩91人妻在线| 日韩av大胆在线观看| 大鸡巴操b视频在线| 天天色天天操天天透| 日韩av熟妇在线观看| 狠狠嗨日韩综合久久| 亚洲的电影一区二区三区| 成人高潮aa毛片免费| 国产真实乱子伦a视频| 欧美黑人性猛交xxxxⅹooo| 熟女少妇激情五十路| 99国内小视频在现欢看| 亚洲av自拍天堂网| 亚洲精品ww久久久久久| 青青青青青手机视频| 欧美一区二区三区四区性视频| 免费69视频在线看| lutube在线成人免费看| 日韩美女搞黄视频免费| 一区二区在线视频中文字幕| 中文字幕视频一区二区在线观看| 激情小视频国产在线| 一区二区三区av高清免费| 亚洲午夜伦理视频在线| av手机在线免费观看日韩av| 人妻少妇亚洲精品中文字幕| 又粗又长 明星操逼小视频 | 欧美精品国产综合久久| 只有精品亚洲视频在线观看| 中文字幕av男人天堂| 国产老熟女伦老熟妇ⅹ| 岳太深了紧紧的中文字幕| 色哟哟国产精品入口| 亚洲天天干 夜夜操| 一区二区久久成人网| 天天日天天爽天天干| 国产精品一区二区av国| 蜜臀av久久久久久久| 亚洲欧美激情人妻偷拍| 久久这里只有精品热视频| 91亚洲手机在线视频播放| 欧美爆乳肉感大码在线观看| 免费观看丰满少妇做受| av老司机精品在线观看| 欧美亚洲国产成人免费在线| 自拍偷拍日韩欧美亚洲| 五十路在线观看完整版| 日韩av大胆在线观看| 适合午夜一个人看的视频| 噜噜色噜噜噜久色超碰| 91久久精品色伊人6882| 99re6热在线精品| 日本熟女精品一区二区三区| 欧美另类重口味极品在线观看| 中文字幕第一页国产在线| 四川五十路熟女av| 狠狠操狠狠操免费视频| 337p日本大胆欧美人| 天天日天天日天天擦| 最新日韩av传媒在线| 国产精品成人xxxx| 在线免费观看视频一二区| 天天干天天搞天天摸| 日本丰满熟妇BBXBBXHD| 欧美久久一区二区伊人| 国产精品人妻66p| 午夜婷婷在线观看视频| 直接观看免费黄网站| 中文字幕在线视频一区二区三区 | 国产极品美女久久久久久| 国产精品久久久久网| 亚洲av男人天堂久久| 动漫美女的小穴视频| 最新91精品视频在线| 麻豆精品成人免费视频| 亚洲天天干 夜夜操| yellow在线播放av啊啊啊| 激情国产小视频在线| 1区2区3区不卡视频| 最新日韩av传媒在线| 家庭女教师中文字幕在线播放| 可以在线观看的av中文字幕| 91精品视频在线观看免费| 欧美一级色视频美日韩| 护士特殊服务久久久久久久| 国产 在线 免费 精品| 丁香花免费在线观看中文字幕| 中文字幕日韩精品日本| 男生用鸡操女生视频动漫| 中文字幕人妻熟女在线电影| 姐姐的朋友2在线观看中文字幕| 国产真实灌醉下药美女av福利| 欧美久久久久久三级网| 天天操天天干天天艹| 成年人黄视频在线观看| 精内国产乱码久久久久久| 天堂av在线播放免费| 姐姐的朋友2在线观看中文字幕| 男生用鸡操女生视频动漫| 国产卡一卡二卡三乱码手机| 人妻无码中文字幕专区| 国产污污污污网站在线| 精品少妇一二三视频在线| 久久久久久99国产精品| 日韩精品中文字幕福利| 自拍 日韩 欧美激情| 国产午夜福利av导航| asmr福利视频在线观看| 99精品久久久久久久91蜜桃| 97香蕉碰碰人妻国产樱花| 亚洲蜜臀av一区二区三区九色 | 啪啪啪啪啪啪啪啪啪啪黄色| 伊人日日日草夜夜草| 国产日韩一区二区在线看| 欧美黄色录像免费看的| 自拍偷拍vs一区二区三区| 91国内视频在线观看| 久久久久久性虐视频| 中文字幕+中文字幕| 日韩成人免费电影二区| 红杏久久av人妻一区| 黄色视频成年人免费观看| 综合激情网激情五月五月婷婷| 早川濑里奈av黑人番号| 被大鸡吧操的好舒服视频免费| 午夜场射精嗯嗯啊啊视频| chinese国产盗摄一区二区| 亚洲成人午夜电影在线观看| 亚洲va天堂va国产va久| 韩国亚洲欧美超一级在线播放视频| 亚洲少妇高潮免费观看| 国产综合高清在线观看| 亚洲公开视频在线观看| 偷拍自拍国产在线视频| 国产a级毛久久久久精品| 午夜精品一区二区三区4| 亚洲一区二区人妻av| AV天堂一区二区免费试看| 欧美天堂av无线av欧美| 中文字幕综合一区二区| 小泽玛利亚视频在线观看| 久久热这里这里只有精品| 久久久久久久久久久免费女人| 五月婷婷在线观看视频免费| 啊用力插好舒服视频| 超碰97免费人妻麻豆| 蜜桃视频在线欧美一区| 亚洲中文精品人人免费| 极品性荡少妇一区二区色欲| 日本性感美女视频网站| 超pen在线观看视频公开97| 午夜蜜桃一区二区三区| 亚洲日本一区二区三区 | 美女骚逼日出水来了| 91久久国产成人免费网站| 亚洲国产40页第21页| 3344免费偷拍视频| 老司机99精品视频在线观看| 操人妻嗷嗷叫视频一区二区| 亚洲精品欧美日韩在线播放 | 精品国产污污免费网站入口自| 综合国产成人在线观看| 亚洲另类图片蜜臀av| 中文字幕日韩无敌亚洲精品 | 后入美女人妻高清在线| 欧美成人综合视频一区二区| 亚洲精品午夜久久久久| 日韩精品一区二区三区在线播放| 亚洲熟女久久久36d| 夜夜躁狠狠躁日日躁麻豆内射 | 亚洲伊人久久精品影院一美女洗澡| 日本福利午夜电影在线观看| 日韩近亲视频在线观看| 直接能看的国产av| 香蕉aⅴ一区二区三区| 人妻少妇性色欲欧美日韩| 中国黄色av一级片| 成人在线欧美日韩国产| asmr福利视频在线观看| 婷婷午夜国产精品久久久| 亚洲另类伦春色综合小| 久久机热/这里只有| 中文字幕之无码色多多| 久久久久久cao我的性感人妻| 馒头大胆亚洲一区二区| 午夜的视频在线观看| 亚洲视频在线视频看视频在线| 99精品国产免费久久| 激情五月婷婷综合色啪| 亚洲 清纯 国产com| 国产免费高清视频视频| 日韩精品中文字幕播放| 夫妻在线观看视频91| 婷婷色中文亚洲网68| 欧美男同性恋69视频| 性色蜜臀av一区二区三区| 中国把吊插入阴蒂的视频| 性色av一区二区三区久久久| 中文字幕高清在线免费播放 | 新97超碰在线观看| 中文字幕在线一区精品| 91av中文视频在线| 免费福利av在线一区二区三区| 久草视频 久草视频2| 色伦色伦777国产精品| 首之国产AV医生和护士小芳| 在线免费观看亚洲精品电影| 日本免费视频午夜福利视频| 端庄人妻堕落挣扎沉沦| 国产精品视频一区在线播放| 精品久久久久久久久久久久人妻| 97精品视频在线观看| 免费av岛国天堂网站| 欧美精品激情在线最新观看视频| 精品亚洲在线免费观看| 色婷婷综合激情五月免费观看| www久久久久久久久久久| 又粗又长 明星操逼小视频| 亚洲免费国产在线日韩| 国产熟妇一区二区三区av| 国产+亚洲+欧美+另类| 少妇人妻真实精品视频| chinese国产盗摄一区二区 | 亚洲综合乱码一区二区| 天天操天天插天天色| 福利在线视频网址导航| 岛国青草视频在线观看| 国产大鸡巴大鸡巴操小骚逼小骚逼 | 初美沙希中文字幕在线| 免费一级黄色av网站| 青草亚洲视频在线观看| 丰满的继坶3中文在线观看| 日韩人妻在线视频免费| 亚洲人人妻一区二区三区| 黄色无码鸡吧操逼视频| 婷婷色中文亚洲网68| 国产aⅴ一线在线观看| 在线免费观看日本伦理| 精品av国产一区二区三区四区| 日韩精品中文字幕播放| 国产久久久精品毛片| 婷婷激情四射在线观看视频| aaa久久久久久久久| 亚洲成人国产综合一区| 天码人妻一区二区三区在线看| 社区自拍揄拍尻屁你懂的 | 国产在线91观看免费观看| 日韩av有码一区二区三区4| 92福利视频午夜1000看| av森泽佳奈在线观看| 大鸡巴操娇小玲珑的女孩逼| 无码日韩人妻精品久久| 天天日天天爽天天爽| 中文字幕av第1页中文字幕| 美女福利写真在线观看视频| 九九视频在线精品播放| 亚洲人成精品久久久久久久| 少妇人妻二三区视频| 丰满少妇翘臀后进式| 日韩欧美在线观看不卡一区二区| sw137 中文字幕 在线| 日韩在线视频观看有码在线| 黄色男人的天堂视频| gav成人免费播放| 不戴胸罩引我诱的隔壁的人妻| 91国产在线视频免费观看| 在线观看国产网站资源| av老司机精品在线观看| 亚洲色偷偷综合亚洲AV伊人| 亚洲精品欧美日韩在线播放| 一区二区三区欧美日韩高清播放| 国产变态另类在线观看| 欧美aa一级一区三区四区| 精品国产午夜视频一区二区| gav成人免费播放| 男人天堂色男人av| 欧美交性又色又爽又黄麻豆| 国产在线观看黄色视频| 国产精品自拍偷拍a| 成熟熟女国产精品一区| 毛片av在线免费看| 人人爽亚洲av人人爽av| 黄色片黄色片wyaa| 人妻无码色噜噜狠狠狠狠色| 91精品综合久久久久3d动漫| 黄色视频成年人免费观看| 国产精品欧美日韩区二区| 人人妻人人爽人人澡人人精品| 日本免费午夜视频网站| 国产熟妇一区二区三区av| 亚洲欧美精品综合图片小说| 在线观看免费视频色97| 日本高清成人一区二区三区| tube69日本少妇| 久久这里只有精彩视频免费| 福利在线视频网址导航| 亚洲国产美女一区二区三区软件| 97超碰国语国产97超碰| 日韩熟女系列一区二区三区| 久碰精品少妇中文字幕av| 亚洲成av人无码不卡影片一| 桃色视频在线观看一区二区| av日韩在线观看大全| 一区二区三区国产精选在线播放| 男生舔女生逼逼视频| 偷拍自拍 中文字幕| 亚洲成人av一区在线| 久久久精品精品视频视频| 中文字幕人妻三级在线观看| 日本韩国免费福利精品| 国产高清在线观看1区2区| 成年人黄视频在线观看| 青青青青在线视频免费观看| 亚洲一区自拍高清免费视频| 老司机午夜精品视频资源| AV无码一区二区三区不卡| 男人和女人激情视频| 一区二区三区欧美日韩高清播放| 91啪国自产中文字幕在线| 日本脱亚入欧是指什么| 丝袜美腿视频诱惑亚洲无| 免费岛国喷水视频在线观看| 精品一区二区亚洲欧美| 国产三级影院在线观看| 不卡一不卡二不卡三| 亚洲欧美另类手机在线| 狠狠操狠狠操免费视频| av中文字幕网址在线| 在线免费观看欧美小视频| 天天日夜夜干天天操| 久久久久五月天丁香社区| 91国内视频在线观看| 99久久久无码国产精品性出奶水| 精品美女久久久久久| 色婷婷综合激情五月免费观看 | 中文字幕+中文字幕| 最近中文字幕国产在线| 熟女91pooyn熟女| 亚洲精品中文字幕下载| 国产一区二区三免费视频| 国产成人小视频在线观看无遮挡| 亚洲日本一区二区久久久精品| 在线观看免费视频色97| 亚洲成人情色电影在线观看| 成人高清在线观看视频| 欧亚日韩一区二区三区观看视频| 中文字幕在线观看极品视频| 免费手机黄页网址大全| 亚洲一区二区三区久久受| 日韩人妻丝袜中文字幕| 国产精品国产三级国产午| 亚洲一区二区三区偷拍女厕91| 99热这里只有精品中文| 国产V亚洲V天堂无码欠欠| 夫妻在线观看视频91| 蜜桃视频入口久久久| 亚洲精品国偷自产在线观看蜜桃| 丝袜美腿欧美另类 中文字幕| 一区二区三区综合视频| 亚洲天堂av最新网址| 岛国免费大片在线观看| 青青草在观免费国产精品| 在线观看911精品国产 | 日韩精品激情在线观看| 天天色天天操天天舔| 欧美黑人巨大性xxxxx猛交| 狠狠操操操操操操操操操| 欧美区一区二区三视频| 精品人妻一二三区久久| 色综合久久久久久久久中文| 香港三日本三韩国三欧美三级| 蜜桃臀av蜜桃臀av| 日韩av熟妇在线观看| 夜色撩人久久7777| 美女被肏内射视频网站| 日韩中文字幕福利av| 久草视频在线免播放| 激情啪啪啪啪一区二区三区| 521精品视频在线观看| 视频一区二区三区高清在线| 色爱av一区二区三区| 黑人大几巴狂插日本少妇| 亚洲av无女神免非久久| 538精品在线观看视频| 欧美精品欧美极品欧美视频| 人人人妻人人澡人人| 黄色中文字幕在线播放| 精品国产污污免费网站入口自| av亚洲中文天堂字幕网| 青青社区2国产视频| 自拍偷拍vs一区二区三区| 红杏久久av人妻一区| 搡老妇人老女人老熟女| 端庄人妻堕落挣扎沉沦| 日本一区精品视频在线观看| 日本av熟女在线视频| 9色在线视频免费观看| 亚洲老熟妇日本老妇| 男人操女人的逼免费视频| 亚洲男人在线天堂网| 精品91高清在线观看| 精品一区二区亚洲欧美| 国产性色生活片毛片春晓精品| 亚洲美女美妇久久字幕组| 中文字幕 人妻精品| 日韩在线中文字幕色| 欧美视频综合第一页| 日韩二区视频一线天婷婷五| 中文字幕 码 在线视频| 亚洲一区制服丝袜美腿| 亚洲美女美妇久久字幕组| 免费一级黄色av网站| 青青在线视频性感少妇和隔壁黑丝| 国产a级毛久久久久精品| 888欧美视频在线| 日韩精品中文字幕播放| 天天操夜夜骑日日摸| 午夜精品亚洲精品五月色| 综合激情网激情五月天| 97小视频人妻一区二区| 天天躁日日躁狠狠躁躁欧美av| 99精品国产免费久久| 久久久久久9999久久久久| 亚洲男人让女人爽的视频| 91极品大一女神正在播放 | 精品视频一区二区三区四区五区| asmr福利视频在线观看| 成年人啪啪视频在线观看| 国产刺激激情美女网站| 中国黄色av一级片| 欧美日韩不卡一区不区二区| 在线制服丝袜中文字幕| 欧美80老妇人性视频| 专门看国产熟妇的网站| 中文字幕在线永久免费播放| 69精品视频一区二区在线观看| 日本一区精品视频在线观看| 久久久超爽一二三av| 亚洲精品三级av在线免费观看| av老司机精品在线观看| ka0ri在线视频| brazzers欧熟精品系列| 欧美日韩人妻久久精品高清国产| 亚洲欧美国产综合777| 国产精品一区二区三区蜜臀av | 久久久极品久久蜜桃| 欧美一区二区三区久久久aaa| 老师啊太大了啊啊啊尻视频| 日韩av中文在线免费观看| 免费在线看的黄网站| 日本免费视频午夜福利视频| 亚洲男人在线天堂网| 欧美精品中文字幕久久二区| 欧美特色aaa大片| 9国产精品久久久久老师| 亚洲一区二区三区av网站| 日本成人不卡一区二区| 青青青青青青青青青国产精品视频| 国产精品熟女久久久久浪潮| 日韩精品中文字幕福利| 成人亚洲国产综合精品| 天天日天天摸天天爱| 美女大bxxxx内射| 中文字幕一区二区亚洲一区| 日韩中文字幕精品淫| 日韩人妻在线视频免费| 一区二区三区日本伦理| 天天干天天操天天玩天天射| 97国产福利小视频合集| 韩国AV无码不卡在线播放| 自拍偷拍日韩欧美亚洲| 久久精品视频一区二区三区四区| 淫秽激情视频免费观看| 欧美80老妇人性视频| 首之国产AV医生和护士小芳| 国产精品欧美日韩区二区| 亚洲欧美综合在线探花| 激情啪啪啪啪一区二区三区| 亚洲日本一区二区久久久精品| 综合色区亚洲熟妇shxstz| 国产+亚洲+欧美+另类| 国产a级毛久久久久精品| 国产成人午夜精品福利| 国产精品系列在线观看一区二区| 91国产在线免费播放| 青青在线视频性感少妇和隔壁黑丝| av成人在线观看一区| 精品区一区二区三区四区人妻| 国产精品久久9999| 揄拍成人国产精品免费看视频| 亚洲第17页国产精品| 99精品视频在线观看婷婷| 在线观看免费av网址大全| 亚洲福利精品视频在线免费观看| 好吊视频—区二区三区| 女蜜桃臀紧身瑜伽裤| 人妻少妇精品久久久久久| 美女吃鸡巴操逼高潮视频| 日本熟妇一区二区x x| 亚洲国产精品美女在线观看| 国产成人精品亚洲男人的天堂| 日本女人一级免费片| 91在线视频在线精品3| 精品人妻伦一二三区久| 亚洲图库另类图片区| 99婷婷在线观看视频| 亚洲第17页国产精品| 亚洲熟妇x久久av久久| 国产熟妇乱妇熟色T区| 黄色成年网站午夜在线观看 | chinese国产盗摄一区二区| 中文字幕人妻一区二区视频| 亚洲av可乐操首页| 福利视频一区二区三区筱慧| 精品老妇女久久9g国产| 午夜大尺度无码福利视频| 经典国语激情内射视频| 蝴蝶伊人久久中文娱乐网| 精品人妻伦一二三区久| 美女在线观看日本亚洲一区| 97精品成人一区二区三区| 男人插女人视频网站| 少妇与子乱在线观看| 快点插进来操我逼啊视频| 大香蕉大香蕉在线看| 天天日天天透天天操| 日本啪啪啪啪啪啪啪| 欲乱人妻少妇在线视频裸| 亚洲精品中文字幕下载| 亚洲熟色妇av日韩熟色妇在线| 亚洲男人让女人爽的视频| 一级a看免费观看网站| yy96视频在线观看| 亚洲区美熟妇久久久久| 人妻少妇亚洲一区二区| 不戴胸罩引我诱的隔壁的人妻| av天堂资源最新版在线看| 亚洲av自拍偷拍综合| 2012中文字幕在线高清| 久久久久五月天丁香社区| 国产精品人妻熟女毛片av久| 动漫av网站18禁| 日韩亚洲高清在线观看| 人妻少妇亚洲一区二区| 中文字幕在线永久免费播放| 日韩成人综艺在线播放| 1769国产精品视频免费观看| 中文字幕之无码色多多| 人妻3p真实偷拍一二区| 夜夜嗨av一区二区三区中文字幕| 天天综合天天综合天天网| 骚逼被大屌狂草视频免费看| 人妻久久久精品69系列| 免费看美女脱光衣服的视频| 天天日天天干天天干天天日| 一区二区三区四区五区性感视频| 国产成人小视频在线观看无遮挡| 99热这里只有精品中文| 国产欧美精品不卡在线| 日本www中文字幕| 亚洲精品国品乱码久久久久| 日本性感美女视频网站| 91试看福利一分钟| 99精品国产自在现线观看| 国产女人被做到高潮免费视频| 亚洲国产欧美一区二区丝袜黑人| 亚洲精品高清自拍av| 国产1区,2区,3区| 一二三中文乱码亚洲乱码one| 久久久久久九九99精品| 国产精品一区二区av国| 男人的天堂一区二区在线观看| 欧美亚洲免费视频观看| 免费人成黄页网站在线观看国产 | 1024久久国产精品| 日本少妇人妻xxxxx18| 丰满少妇人妻xxxxx| 一区二区视频视频视频| av欧美网站在线观看| 日本乱人一区二区三区| 男女第一次视频在线观看| 毛茸茸的大外阴中国视频| 免费男阳茎伸入女阳道视频 | 18禁美女黄网站色大片下载| 成人av在线资源网站| 色婷婷精品大在线观看| 天天操天天插天天色| 中国黄片视频一区91| 家庭女教师中文字幕在线播放| 亚洲伊人久久精品影院一美女洗澡 | 啪啪啪操人视频在线播放| 91天堂精品一区二区| 国产久久久精品毛片| 91欧美在线免费观看| 97人妻色免费视频| 性感美女福利视频网站| 日比视频老公慢点好舒服啊| 国产不卡av在线免费| 99一区二区在线观看| 岛国av高清在线成人在线| 五十路av熟女松本翔子| gay gay男男瑟瑟在线网站| 高清一区二区欧美系列| 和邻居少妇愉情中文字幕| 日本a级视频老女人| 一级黄色片夫妻性生活| 最新国产亚洲精品中文在线| 久久精品国产999| 成人H精品动漫在线无码播放| 天天日天天摸天天爱| 人人妻人人爽人人添夜| 午夜青青草原网在线观看| 欧美亚洲牲夜夜综合久久| 久久久久久久久久一区二区三区 | 久久久久久cao我的性感人妻| 乱亲女秽乱长久久久| 国产亚洲精品品视频在线| 国产又粗又硬又大视频| 亚洲综合乱码一区二区| 国产第一美女一区二区三区四区| 宅男噜噜噜666国产| 免费在线黄色观看网站| 91‖亚洲‖国产熟女| 欧美一区二区三区高清不卡tv| 女生被男生插的视频网站| 五月天中文字幕内射| 欧亚日韩一区二区三区观看视频| 97青青青手机在线视频| 青青热久免费精品视频在线观看| 日本在线不卡免费视频| 91成人在线观看免费视频| 欧亚日韩一区二区三区观看视频| 中国黄色av一级片| 99久久99一区二区三区| 性欧美激情久久久久久久 | 少妇人妻二三区视频| 亚洲粉嫩av一区二区三区| 国产麻豆剧果冻传媒app| 免费成人va在线观看| 91久久精品色伊人6882| 国产精品成久久久久三级蜜臀av| 欧美成人黄片一区二区三区| 亚洲激情偷拍一区二区| 99久久久无码国产精品性出奶水| 超碰在线观看免费在线观看| 久青青草视频手机在线免费观看 | 亚洲av可乐操首页| 精品国产在线手机在线| av无限看熟女人妻另类av| 中文字幕一区二 区二三区四区 | 激情国产小视频在线| 国产黄色a级三级三级三级| 亚洲精品乱码久久久久久密桃明 | 久久精品亚洲成在人线a| 人妻少妇中文有码精品| 在线观看国产免费麻豆| 亚洲一区二区三区偷拍女厕91| 亚洲精品福利网站图片| 蜜桃久久久久久久人妻| 强行扒开双腿猛烈进入免费版 | 久久久麻豆精亚洲av麻花| 国产日韩精品电影7777| 在线观看视频污一区| 蜜桃精品久久久一区二区| 国产精品久久9999| 自拍偷拍,中文字幕| 国产亚洲国产av网站在线| 国产一线二线三线的区别在哪 | 亚洲va国产va欧美va在线| 国产精品自拍偷拍a| 2020国产在线不卡视频 | 国产精品一区二区三区蜜臀av| 人妻另类专区欧美制服| 中文字幕高清资源站| 沙月文乃人妻侵犯中文字幕在线| 在线 中文字幕 一区| 免费成人av中文字幕| 国产露脸对白在线观看| 国产女人叫床高潮大片视频| 中文字幕第1页av一天堂网| 亚洲av香蕉一区区二区三区犇| 最新国产精品拍在线观看| 亚洲精品国品乱码久久久久| 91色网站免费在线观看| 天天干天天操天天爽天天摸 | 国产视频网站国产视频| 亚洲欧美色一区二区| 亚洲Av无码国产综合色区| 亚洲一区二区久久久人妻| 91中文字幕最新合集| 新97超碰在线观看| 在线观看视频污一区| 最后99天全集在线观看| 久久永久免费精品人妻专区| 一本久久精品一区二区| 亚洲av无硬久久精品蜜桃| 欧美一区二区三区啪啪同性| 五月天中文字幕内射| 97人妻色免费视频| 国产chinesehd精品麻豆| 亚洲2021av天堂| 国产午夜男女爽爽爽爽爽视频| 18禁美女羞羞免费网站| 激情色图一区二区三区| 欧洲亚洲欧美日韩综合| 欧美黄片精彩在线免费观看| 亚洲另类伦春色综合小| 日本一二三区不卡无| 激情图片日韩欧美人妻| 含骚鸡巴玩逼逼视频| japanese日本熟妇另类| 最近的中文字幕在线mv视频| 天天操天天弄天天射| 亚洲伊人久久精品影院一美女洗澡 | 漂亮 人妻被中出中文| 亚洲成人精品女人久久久| 97瑟瑟超碰在线香蕉| 日本精品视频不卡一二三| 亚洲男人在线天堂网| 亚洲国产精品久久久久蜜桃| 91成人在线观看免费视频| 乱亲女秽乱长久久久| 国产chinesehd精品麻豆| 阴茎插到阴道里面的视频| 国产又色又刺激在线视频| 久久久麻豆精亚洲av麻花| 国产精品一区二区三区蜜臀av| 国产真实乱子伦a视频| 国产a级毛久久久久精品| 日本最新一二三区不卡在线| 欧美一区二区中文字幕电影| 亚洲1区2区3区精华液| 开心 色 六月 婷婷| 亚洲图片欧美校园春色| 日本熟女50视频免费| 中文字幕高清在线免费播放| 国产之丝袜脚在线一区二区三区| av中文字幕福利网| 男女第一次视频在线观看| 老司机福利精品免费视频一区二区| 99精品国产自在现线观看| 免费黄色成人午夜在线网站| 女警官打开双腿沦为性奴| 色天天天天射天天舔| 自拍偷拍亚洲精品第2页| 果冻传媒av一区二区三区| 国产精品伦理片一区二区| 亚洲推理片免费看网站| 国产成人精品午夜福利训2021| 亚洲欧美国产麻豆综合| 欧美成人综合色在线噜噜| weyvv5国产成人精品的视频| 91色九色porny| av中文在线天堂精品| 国产黄色大片在线免费播放| 在线国产中文字幕视频| 91亚洲手机在线视频播放| 操的小逼流水的文章| 大鸡八强奸视频在线观看| japanese五十路熟女熟妇| mm131美女午夜爽爽爽| 91破解版永久免费| 老司机免费福利视频网| 天天插天天色天天日| 国产精品一区二区久久久av| 经典亚洲伊人第一页| 精品一区二区三四区| 97精品人妻一区二区三区精品| 99精品国产免费久久| 91一区精品在线观看| 性欧美日本大妈母与子| 91免费放福利在线观看| 888欧美视频在线| 老师让我插进去69AV| 亚洲国产免费av一区二区三区 | 欧美成人黄片一区二区三区| 天天躁夜夜躁日日躁a麻豆| 老师让我插进去69AV| 高清成人av一区三区| 中文字幕av第1页中文字幕| 久久久久国产成人精品亚洲午夜| 亚洲av无乱一区二区三区性色| 日本丰满熟妇大屁股久久| 日本黄在免费看视频| 97国产精品97久久| 红杏久久av人妻一区| 国产乱子伦一二三区| 免费人成黄页网站在线观看国产| 538精品在线观看视频| 国产日韩欧美视频在线导航| 亚洲高清国产拍青青草原| 亚洲公开视频在线观看| 三级等保密码要求条款| 亚洲 色图 偷拍 欧美| 91中文字幕免费在线观看| 成人免费公开视频无毒| 欧美80老妇人性视频| 福利午夜视频在线观看| 日本一区二区三区免费小视频| 在线观看国产网站资源| 日韩伦理短片在线观看| 国产黄网站在线观看播放| 午夜久久香蕉电影网| 日本韩国在线观看一区二区| 日韩特级黄片高清在线看| 国产精品人妻熟女毛片av久| 69精品视频一区二区在线观看| 亚洲成人黄色一区二区三区| 亚洲精品高清自拍av| 一二三区在线观看视频| 护士小嫩嫩又紧又爽20p| 亚国产成人精品久久久| 久久精品亚洲成在人线a| 日本免费一级黄色录像| 国产午夜亚洲精品不卡在线观看| 99re国产在线精品| 久久www免费人成一看片| 久久香蕉国产免费天天| 黄工厂精品视频在线观看 | av亚洲中文天堂字幕网| 国产午夜激情福利小视频在线| 91精品激情五月婷婷在线| 国产欧美精品一区二区高清| 一级黄色片夫妻性生活| 丝袜长腿第一页在线| 成人性黑人一级av| 亚洲人成精品久久久久久久| 91大屁股国产一区二区| 青青青青在线视频免费观看| 日本高清成人一区二区三区| 夜夜嗨av蜜臀av| 亚洲第一伊人天堂网| 一区二区视频在线观看免费观看| 国产福利在线视频一区| 国产内射中出在线观看| 亚洲av男人的天堂你懂的| 日本高清撒尿pissing| 婷婷久久一区二区字幕网址你懂得 | 欧美熟妇一区二区三区仙踪林| 亚洲超碰97人人做人人爱| 丝袜美腿欧美另类 中文字幕| 国产清纯美女al在线| 大肉大捧一进一出好爽在线视频| 国产欧美精品不卡在线| 91社福利《在线观看| 久久久精品精品视频视频| 香蕉aⅴ一区二区三区| 人人妻人人爱人人草| 快插进小逼里大鸡吧视频| 亚洲公开视频在线观看| 99re6热在线精品| 午夜国产免费福利av| 少妇一区二区三区久久久| 视频久久久久久久人妻| 91九色国产porny蝌蚪| 99热色原网这里只有精品| 天天干夜夜操啊啊啊| 国产精品久久久久久久精品视频| 99国产精品窥熟女精品| 国产1区,2区,3区| 97人妻色免费视频| 人妻凌辱欧美丰满熟妇| 538精品在线观看视频| 任你操视频免费在线观看| 精品suv一区二区69| 在线制服丝袜中文字幕| 久久麻豆亚洲精品av| 日本av熟女在线视频| 欧美一级片免费在线成人观看| 福利视频一区二区三区筱慧| 欧美男人大鸡吧插女人视频| 免费国产性生活视频| 亚洲av日韩精品久久久久久hd| 欧美亚洲国产成人免费在线| 丝袜长腿第一页在线| 亚洲av无乱一区二区三区性色| 国产一区成人在线观看视频| 青青青青青手机视频| 午夜激情高清在线观看| 美女被肏内射视频网站| 最新欧美一二三视频 | 欧洲亚洲欧美日韩综合| 天天干天天啪天天舔| 夫妻在线观看视频91| 日本中文字幕一二区视频| av男人天堂狠狠干| 99精品视频之69精品视频 | 欧美日韩情色在线观看| 黄色片黄色片wyaa| 日韩美女综合中文字幕pp| 中文字幕奴隷色的舞台50| 国产精品视频一区在线播放| 午夜毛片不卡免费观看视频| 国产黄色大片在线免费播放| 久久久久久久99精品| 天码人妻一区二区三区在线看| 美女视频福利免费看| 欧美亚洲少妇福利视频| 丝袜美腿视频诱惑亚洲无| 成年午夜免费无码区| 夜夜嗨av蜜臀av| 一色桃子人妻一区二区三区| av在线观看网址av| 成人av在线资源网站| 亚洲美女自偷自拍11页| 日韩精品中文字幕播放| 老司机免费福利视频网| 色综合久久久久久久久中文| 天天日夜夜操天天摸| 亚洲欧美成人综合视频| 亚洲麻豆一区二区三区| 任你操任你干精品在线视频| 免费福利av在线一区二区三区| 天码人妻一区二区三区在线看| 99精品久久久久久久91蜜桃| 精品日产卡一卡二卡国色天香| 国产精品人妻66p| 一区二区三区蜜臀在线| 午夜激情久久不卡一区二区| 色综合久久久久久久久中文| 国产欧美精品一区二区高清| 在线播放 日韩 av| 欧美日韩亚洲国产无线码| 大香蕉伊人中文字幕| 国产精品久久久黄网站| 天天色天天爱天天爽| 欧美中国日韩久久精品| 又黄又刺激的午夜小视频| 性色av一区二区三区久久久| avjpm亚洲伊人久久| 自拍偷拍 国产资源| 99热这里只有国产精品6| 国产精品探花熟女在线观看| 亚洲国产第一页在线观看| 欧美少妇性一区二区三区| 人人妻人人人操人人人爽| 国产普通话插插视频|