日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis会遇到的15个「坑」,你踩过几个?

發(fā)布時間:2024/2/28 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis会遇到的15个「坑」,你踩过几个? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這篇文章,我想和你聊一聊在使用 Redis 時,可能會踩到的「坑」。

如果你在使用 Redis 時,也遇到過以下這些「詭異」的場景,那很大概率是踩到「坑」了:

  • 明明一個 key 設(shè)置了過期時間,怎么變成不過期了?

  • 使用 O(1) 復(fù)雜度的 SETBIT 命令,Redis 竟然被 OOM 了?

  • 執(zhí)行 RANDOMKEY 隨機拿出一個 key,竟然也會阻塞 Redis?

  • 同樣的命令,為什么主庫查不到數(shù)據(jù),從庫卻可以查到?

  • 從庫內(nèi)存為什么比主庫用得還多?

  • 寫入到 Redis 的數(shù)據(jù),為什么莫名其妙丟了?

  • ...

究竟是什么原因,導(dǎo)致的這些問題呢?

這篇文章,我就來和你盤點一下,使用 Redis 時可能會踩到「坑」,以及如何去規(guī)避。

我把這些問題劃分成了三大部分:

  • 常見命令有哪些坑?

  • 數(shù)據(jù)持久化有哪些坑?

  • 主從庫同步有哪些坑?

  • 導(dǎo)致這些問題的原因,很有可能會「顛覆」你的認(rèn)知,如果你準(zhǔn)備好了,那就跟著我的思路開始吧!

    這篇文章干貨很多,希望你可以耐心讀完。

    常見命令有哪些坑?

    首先,我們來看一下,平時在使用 Redis 時,有哪些常見的命令會遇到「意料之外」的結(jié)果。

    1) 過期時間意外丟失?

    你在使用 Redis 時,肯定經(jīng)常使用 SET 命令,它非常簡單。

    SET 除了可以設(shè)置 key-value 之外,還可以設(shè)置 key 的過期時間,就像下面這樣:

    127.0.0.1:6379>?SET?testkey?val1?EX?60 OK 127.0.0.1:6379>?TTL?testkey (integer)?59

    此時如果你想修改 key 的值,但只是單純地使用 SET 命令,而沒有加上「過期時間」的參數(shù),那這個 key 的過期時間將會被「擦除」。

    127.0.0.1:6379>?SET?testkey?val2 OK 127.0.0.1:6379> TTL testkey ?// key永遠不過期了! (integer)?-1

    看到了么?testkey 變成永遠不過期了!

    如果你剛剛開始使用 Redis,相信你肯定也踩過這個坑。

    導(dǎo)致這個問題的原因在于:SET 命令如果不設(shè)置過期時間,那么 Redis 會自動「擦除」這個 key 的過期時間。

    如果你發(fā)現(xiàn) Redis 的內(nèi)存持續(xù)增長,而且很多 key 原來設(shè)置了過期時間,后來發(fā)現(xiàn)過期時間丟失了,很有可能是因為這個原因?qū)е碌摹?/p>

    這時你的 Redis 中就會存在大量不過期的 key,消耗過多的內(nèi)存資源。

    所以,你在使用 SET 命令時,如果剛開始就設(shè)置了過期時間,那么之后修改這個 key,也務(wù)必要加上過期時間的參數(shù),避免過期時間丟失問題。

    2) DEL 竟然也會阻塞 Redis?

    刪除一個 key,你肯定會用 DEL 命令,不知道你沒有思考過它的時間復(fù)雜度是多少?

    O(1)?其實不一定。

    如果你有認(rèn)真閱讀 Redis 的官方文檔,就會發(fā)現(xiàn):刪除一個 key 的耗時,與這個 key 的類型有關(guān)。

    Redis 官方文檔在介紹 DEL 命令時,是這樣描述的:

    • key 是 String 類型,DEL 時間復(fù)雜度是 O(1)

    • key 是 List/Hash/Set/ZSet 類型,DEL 時間復(fù)雜度是 O(M),M 為元素數(shù)量

    也就是說,如果你要刪除的是一個非 String 類型的 key,這個 key 的元素越多,那么在執(zhí)行 DEL 時耗時就越久!

    為什么會這樣?

    原因在于,刪除這種 key 時,Redis 需要依次釋放每個元素的內(nèi)存,元素越多,這個過程就會越耗時。

    而這么長的操作耗時,勢必會阻塞整個 Redis 實例,影響 Redis 的性能。

    所以,當(dāng)你在刪除 List/Hash/Set/ZSet 類型的 key 時,一定要格外注意,不能無腦執(zhí)行 DEL,而是應(yīng)該用以下方式刪除:

  • 查詢元素數(shù)量:執(zhí)行 LLEN/HLEN/SCARD/ZCARD 命令

  • 判斷元素數(shù)量:如果元素數(shù)量較少,可直接執(zhí)行 DEL 刪除,否則分批刪除

  • 分批刪除:執(zhí)行 LRANGE/HSCAN/SSCAN/ZSCAN + LPOP/RPOP/HDEL/SREM/ZREM 刪除

  • 了解了 DEL 對于 List/Hash/Set/ZSet 類型數(shù)據(jù)的影響,我們再來分析下,刪除一個 String 類型的 key 會不會有這種問題?

    啊?前面不是提到,Redis 官方文檔的描述,刪除 String 類型的 key,時間復(fù)雜度是 O(1) 么?這不會導(dǎo)致 Redis 阻塞吧?

    其實這也不一定!

    你思考一下,如果這個 key 占用的內(nèi)存非常大呢?

    例如,這個 key 存儲了 500MB 的數(shù)據(jù)(很明顯,它是一個 bigkey),那在執(zhí)行 DEL 時,耗時依舊會變長!

    這是因為,Redis 釋放這么大的內(nèi)存給操作系統(tǒng),也是需要時間的,所以操作耗時也會變長。

    所以,對于 String 類型來說,你最好也不要存儲過大的數(shù)據(jù),否則在刪除它時,也會有性能問題。

    此時,你可能會想:Redis 4.0 不是推出了 lazy-free 機制么?打開這個機制,釋放內(nèi)存的操作會放到后臺線程中執(zhí)行,那是不是就不會阻塞主線程了?

    這個問題非常好。

    真的會是這樣嗎?

    這里我先告訴你結(jié)論:即使 Redis 打開了 lazy-free,在刪除一個 String 類型的 bigkey 時,它仍舊是在主線程中處理,而不是放到后臺線程中執(zhí)行。所以,依舊有阻塞 Redis 的風(fēng)險!

    這是為什么?

    這里先賣一個關(guān)子,感興趣的同學(xué)可以先自行查閱 lazy-free 相關(guān)資料尋找答案。:)

    其實,關(guān)于 lazy-free 的知識點也很多,由于篇幅原因,所以我打算后面專門寫一篇文章來講,歡迎持續(xù)關(guān)注~

    3) RANDOMKEY 竟然也會阻塞 Redis?

    如果你想隨機查看 Redis 中的一個 key,通常會使用 RANDOMKEY 這個命令。

    這個命令會從 Redis 中「隨機」取出一個 key。

    既然是隨機,那這個執(zhí)行速度肯定非??彀?#xff1f;

    其實不然。

    要解釋清楚這個問題,就要結(jié)合 Redis 的過期策略來講。

    如果你對 Redis 的過期策略有所了解,應(yīng)該知道 Redis 清理過期 key,是采用定時清理 + 懶惰清理 2 種方式結(jié)合來做的。

    而 RANDOMKEY 在隨機拿出一個 key 后,首先會先檢查這個 key 是否已過期。

    如果該 key 已經(jīng)過期,那么 Redis 會刪除它,這個過程就是懶惰清理。

    但清理完了還不能結(jié)束,Redis 還要找出一個「不過期」的 key,返回給客戶端。

    此時,Redis 則會繼續(xù)隨機拿出一個 key,然后再判斷是它否過期,直到找出一個未過期的 key 返回給客戶端。

    整個流程就是這樣的:

  • master 隨機取出一個 key,判斷是否已過期

  • 如果 key 已過期,刪除它,繼續(xù)隨機取 key

  • 以此循環(huán)往復(fù),直到找到一個不過期的 key,返回

  • 但這里就有一個問題了:如果此時 Redis 中,有大量 key 已經(jīng)過期,但還未來得及被清理掉,那這個循環(huán)就會持續(xù)很久才能結(jié)束,而且,這個耗時都花費在了清理過期 key + 尋找不過期 key 上。

    導(dǎo)致的結(jié)果就是,RANDOMKEY 執(zhí)行耗時變長,影響 Redis 性能。

    以上流程,其實是在 master 上執(zhí)行的。

    如果在 slave 上執(zhí)行 RANDOMEKY,那么問題會更嚴(yán)重!

    為什么?

    主要原因就在于,slave 自己是不會清理過期 key。

    那 slave 什么時候刪除過期 key 呢?

    其實,當(dāng)一個 key 要過期時,master 會先清理刪除它,之后 master 向 slave 發(fā)送一個 DEL 命令,告知 slave 也刪除這個 key,以此達到主從庫的數(shù)據(jù)一致性。

    還是同樣的場景:Redis 中存在大量已過期,但還未被清理的 key,那在 slave 上執(zhí)行 RANDOMKEY 時,就會發(fā)生以下問題:

  • slave 隨機取出一個 key,判斷是否已過期

  • key 已過期,但 slave 不會刪除它,而是繼續(xù)隨機尋找不過期的 key

  • 由于大量 key 都已過期,那 slave 就會尋找不到符合條件的 key,此時就會陷入「死循環(huán)」!

  • 也就是說,在 slave 上執(zhí)行 RANDOMKEY,有可能會造成整個 Redis 實例卡死!

    是不是沒想到?在 slave 上隨機拿一個 key,竟然有可能造成這么嚴(yán)重的后果?

    這其實是 Redis 的一個 Bug,這個 Bug 一直持續(xù)到 5.0 才被修復(fù)。

    修復(fù)的解決方案是,在 slave 上執(zhí)行 RANDOMKEY 時,會先判斷整個實例所有 key 是否都設(shè)置了過期時間,如果是,為了避免長時間找不到符合條件的 key,slave 最多只會在哈希表中尋找 100 次,無論是否能找到,都會退出循環(huán)。

    這個方案就是增加上了一個最大重試次數(shù),這樣一來,就避免了陷入死循環(huán)。

    雖然這個方案可以避免了 slave 陷入死循環(huán)、卡死整個實例的問題,但是,在 master 上執(zhí)行這個命令時,依舊有概率導(dǎo)致耗時變長。

    所以,你在使用 RANDOMKEY 時,如果發(fā)現(xiàn) Redis 發(fā)生了「抖動」,很有可能是因為這個原因?qū)е碌?#xff01;

    4) O(1) 復(fù)雜度的 SETBIT,竟然會導(dǎo)致 Redis OOM?

    在使用 Redis 的 String 類型時,除了直接寫入一個字符串之外,還可以把它當(dāng)做 bitmap 來用。

    具體來講就是,我們可以把一個 String 類型的 key,拆分成一個個 bit 來操作,就像下面這樣:

    127.0.0.1:6379>?SETBIT?testkey?10?1 (integer)?1 127.0.0.1:6379>?GETBIT?testkey?10 (integer)?1

    其中,操作的每一個 bit 位叫做 offset。

    但是,這里有一個坑,你需要注意起來。

    如果這個 key 不存在,或者 key 的內(nèi)存使用很小,此時你要操作的 offset 非常大,那么 Redis 就需要分配「更大的內(nèi)存空間」,這個操作耗時就會變長,影響性能。

    所以,當(dāng)你在使用 SETBIT 時,也一定要注意 offset 的大小,操作過大的 offset 也會引發(fā) Redis 卡頓。

    這種類型的 key,也是典型的 bigkey,除了分配內(nèi)存影響性能之外,在刪除它時,耗時同樣也會變長。

    5) 執(zhí)行 MONITOR 也會導(dǎo)致 Redis OOM?

    這個坑你肯定聽說過很多次了。

    當(dāng)你在執(zhí)行 MONITOR 命令時,Redis 會把每一條命令寫到客戶端的「輸出緩沖區(qū)」中,然后客戶端從這個緩沖區(qū)讀取服務(wù)端返回的結(jié)果。

    但是,如果你的 Redis QPS 很高,這將會導(dǎo)致這個輸出緩沖區(qū)內(nèi)存持續(xù)增長,占用 Redis 大量的內(nèi)存資源,如果恰好你的機器的內(nèi)存資源不足,那 Redis 實例就會面臨被 OOM 的風(fēng)險。

    所以,你需要謹(jǐn)慎使用 MONITOR,尤其在 QPS 很高的情況下。

    以上這些問題場景,都是我們在使用常見命令時發(fā)生的,而且,很可能都是「無意」就會觸發(fā)的。

    下面我們來看 Redis「數(shù)據(jù)持久化」都存在哪些坑?

    數(shù)據(jù)持久化有哪些坑?

    Redis 的數(shù)據(jù)持久化,分為 RDB 和 AOF 兩種方式。

    其中,RDB 是數(shù)據(jù)快照,而 AOF 會記錄每一個寫命令到日志文件中。

    在數(shù)據(jù)持久化方面發(fā)生問題,主要也集中在這兩大塊,我們依次來看。

    1) master 宕機,slave 數(shù)據(jù)也丟失了?

    如果你的 Redis 采用如下模式部署,就會發(fā)生數(shù)據(jù)丟失的問題:

    • master-slave + 哨兵部署實例

    • master 沒有開啟數(shù)據(jù)持久化功能

    • Redis 進程使用 supervisor 管理,并配置為「進程宕機,自動重啟」

    如果此時 master 宕機,就會導(dǎo)致下面的問題:

    • master 宕機,哨兵還未發(fā)起切換,此時 master 進程立即被 supervisor 自動拉起

    • 但 master 沒有開啟任何數(shù)據(jù)持久化,啟動后是一個「空」實例

    • 此時 slave 為了與 master 保持一致,它會自動「清空」實例中的所有數(shù)據(jù),slave 也變成了一個「空」實例

    看到了么?在這個場景下,master / slave 的數(shù)據(jù)就全部丟失了。

    這時,業(yè)務(wù)應(yīng)用在訪問 Redis 時,發(fā)現(xiàn)緩存中沒有任何數(shù)據(jù),就會把請求全部打到后端數(shù)據(jù)庫上,這還會進一步引發(fā)「緩存雪崩」,對業(yè)務(wù)影響非常大。

    所以,你一定要避免這種情況發(fā)生,我給你的建議是:

  • Redis 實例不使用進程管理工具自動拉起

  • master 宕機后,讓哨兵發(fā)起切換,把 slave 提升為 master

  • 切換完成后,再重啟 master,讓其退化成 slave

  • 你在配置數(shù)據(jù)持久化時,要避免這個問題的發(fā)生。

    2) AOF everysec 真的不會阻塞主線程嗎?

    當(dāng) Redis 開啟 AOF 時,需要配置 AOF 的刷盤策略。

    基于性能和數(shù)據(jù)安全的平衡,你肯定會采用 appendfsync everysec 這種方案。

    這種方案的工作模式為,Redis 的后臺線程每間隔 1 秒,就把 AOF page cache 的數(shù)據(jù),刷到磁盤(fsync)上。

    這種方案的優(yōu)勢在于,把 AOF 刷盤的耗時操作,放到了后臺線程中去執(zhí)行,避免了對主線程的影響。

    但真的不會影響主線程嗎?

    答案是否定的。

    其實存在這樣一種場景:Redis 后臺線程在執(zhí)行 AOF page cache 刷盤(fysnc)時,如果此時磁盤 IO 負(fù)載過高,那么調(diào)用 fsync 就會被阻塞住。

    此時,主線程仍然接收寫請求進來,那么此時的主線程會先判斷,上一次后臺線程是否已刷盤成功。

    如何判斷呢?

    后臺線程在刷盤成功后,都會記錄刷盤的時間。

    主線程會根據(jù)這個時間來判斷,距離上一次刷盤已經(jīng)過去多久了。整個流程是這樣的:

  • 主線程在寫 AOF page cache(write系統(tǒng)調(diào)用)前,先檢查后臺 fsync 是否已完成?

  • fsync 已完成,主線程直接寫 AOF page cache

  • fsync 未完成,則檢查距離上次 fsync 過去多久?

  • 如果距離上次 fysnc 成功在 2 秒內(nèi),那么主線程會直接返回,不寫 AOF page cache

  • 如果距離上次 fysnc 成功超過了 2 秒,那主線程會強制寫 AOF page cache(write系統(tǒng)調(diào)用)

  • 由于磁盤 IO 負(fù)載過高,此時,后臺線程 fynsc 會發(fā)生阻塞,那主線程在寫 AOF page cache 時,也會發(fā)生阻塞等待(操作同一個 fd,fsync 和 write 是互斥的,一方必須等另一方成功才可以繼續(xù)執(zhí)行,否則阻塞等待)

  • 通過分析我們可以發(fā)現(xiàn),即使你配置的 AOF 刷盤策略是 appendfsync everysec,也依舊會有阻塞主線程的風(fēng)險。

    其實,產(chǎn)生這個問題的重點在于,磁盤 IO 負(fù)載過高導(dǎo)致 fynsc 阻塞,進而導(dǎo)致主線程寫 AOF page cache 也發(fā)生阻塞。

    所以,你一定要保證磁盤有充足的 IO 資源,避免這個問題。

    3) AOF everysec 真的只會丟失 1 秒數(shù)據(jù)?

    接著上面的問題繼續(xù)分析。

    如上所述,這里我們需要重點關(guān)注上面的步驟 4。

    也就是:主線程在寫 AOF page cache 時,會先判斷上一次 fsync 成功的時間,如果距離上次 fysnc 成功在 2 秒內(nèi),那么主線程會直接返回,不再寫 AOF page cache。

    這就意味著,后臺線程在執(zhí)行 fsync 刷盤時,主線程最多等待 2 秒不會寫 AOF page cache。

    如果此時 Redis 發(fā)生了宕機,那么,AOF 文件中丟失是 2 秒的數(shù)據(jù),而不是 1 秒!

    我們繼續(xù)分析,Redis 主線程為什么要等待 2 秒不寫 AOF page cache 呢?

    其實,Redis AOF 配置為 appendfsync everysec 時,正常來講,后臺線程每隔 1 秒執(zhí)行一次 fsync 刷盤,如果磁盤資源充足,是不會被阻塞住的。

    也就是說,Redis 主線程其實根本不用關(guān)心后臺線程是否刷盤成功,只要無腦寫 AOF page cache 即可。

    但是,Redis 作者考慮到,如果此時的磁盤 IO 資源比較緊張,那么后臺線程 fsync 就有概率發(fā)生阻塞風(fēng)險。

    所以,Redis 作者在主線程寫 AOF page cache 之前,先檢查一下距離上一次 fsync 成功的時間,如果大于 1 秒沒有成功,那么主線程此時就能知道,fsync 可能阻塞了。

    所以,主線程會等待 2 秒不寫 AOF page cache,其目的在于:

  • 降低主線程阻塞的風(fēng)險(如果無腦寫 AOF page cache,主線程則會立即阻塞住)

  • 如果 fsync 阻塞,主線程就會給后臺線程留出 1 秒的時間,等待 fsync 成功

  • 但代價就是,如果此時發(fā)生宕機,AOF 丟失的就是 2 秒的數(shù)據(jù),而不是 1 秒。

    這個方案應(yīng)該是 Redis 作者對性能和數(shù)據(jù)安全性的進一步權(quán)衡。

    無論如何,這里你只需要知道的是,即使 AOF 配置為每秒刷盤,在發(fā)生上述極端情況時,AOF 丟失的數(shù)據(jù)其實是 2 秒。

    4) RDB 和 AOF rewrite 時,Redis 發(fā)生 OOM?

    最后,我們來看一下,當(dāng) Redis 在執(zhí)行 RDB 快照和 AOF rewrite 時,會發(fā)生的問題。

    Redis 在做 RDB 快照和 AOF rewrite 時,會采用創(chuàng)建子進程的方式,把實例中的數(shù)據(jù)持久化到磁盤上。

    創(chuàng)建子進程,會調(diào)用操作系統(tǒng)的 fork 函數(shù)。

    fork 執(zhí)行完成后,父進程和子進程會同時共享同一份內(nèi)存數(shù)據(jù)。

    但此時的主進程依舊是可以接收寫請求的,而進來的寫請求,會采用 Copy On Write(寫時復(fù)制)的方式操作內(nèi)存數(shù)據(jù)。

    也就是說,主進程一旦有數(shù)據(jù)需要修改,Redis 并不會直接修改現(xiàn)有內(nèi)存中的數(shù)據(jù),而是先將這塊內(nèi)存數(shù)據(jù)拷貝出來,再修改這塊新內(nèi)存的數(shù)據(jù),這就是所謂的「寫時復(fù)制」。

    寫時復(fù)制你也可以理解成,誰需要發(fā)生寫操作,誰就先拷貝,再修改。

    你應(yīng)該發(fā)現(xiàn)了,如果父進程要修改一個 key,就需要拷貝原有的內(nèi)存數(shù)據(jù),到新內(nèi)存中,這個過程涉及到了「新內(nèi)存」的申請。

    如果你的業(yè)務(wù)特點是「寫多讀少」,而且 OPS 非常高,那在 RDB 和 AOF rewrite 期間,就會產(chǎn)生大量的內(nèi)存拷貝工作。

    這會有什么問題呢?

    因為寫請求很多,這會導(dǎo)致 Redis 父進程會申請非常多的內(nèi)存。在這期間,修改 key 的范圍越廣,新內(nèi)存的申請就越多。

    如果你的機器內(nèi)存資源不足,這就會導(dǎo)致 Redis 面臨被 OOM 的風(fēng)險!

    這就是你會從 DBA 同學(xué)那里聽到的,要給 Redis 機器預(yù)留內(nèi)存的原因。

    其目的就是避免在 RDB 和 AOF rewrite 期間,防止 Redis OOM。

    以上這些,就是「數(shù)據(jù)持久化」會遇到的坑,你踩到過幾個?

    下面我們再來看「主從復(fù)制」會存在哪些問題。

    主從復(fù)制有哪些坑?

    Redis 為了保證高可用,提供了主從復(fù)制的方式,這樣就可以保證 Redis 有多個「副本」,當(dāng)主庫宕機后,我們依舊有從庫可以使用。

    在主從同步期間,依舊存在很多坑,我們依次來看。

    1) 主從復(fù)制會丟數(shù)據(jù)嗎?

    首先,你需要知道,Redis 的主從復(fù)制是采用「異步」的方式進行的。

    這就意味著,如果 master 突然宕機,可能存在有部分?jǐn)?shù)據(jù)還未同步到 slave 的情況發(fā)生。

    這會導(dǎo)致什么問題呢?

    如果你把 Redis 當(dāng)做純緩存來使用,那對業(yè)務(wù)來說沒有什么影響。

    master 未同步到 slave 的數(shù)據(jù),業(yè)務(wù)應(yīng)用可以從后端數(shù)據(jù)庫中重新查詢到。

    但是,對于把 Redis 當(dāng)做數(shù)據(jù)庫,或是當(dāng)做分布式鎖來使用的業(yè)務(wù),有可能因為異步復(fù)制的問題,導(dǎo)致數(shù)據(jù)丟失 / 鎖丟失。

    關(guān)于 Redis 分布式鎖可靠性的更多細節(jié),這里先不展開,后面會單獨寫一篇文章詳細剖析這個知識點。這里你只需要先知道,Redis 主從復(fù)制是有概率發(fā)生數(shù)據(jù)丟失的。

    2) 同樣命令查詢一個 key,主從庫卻返回不同的結(jié)果?

    不知道你是否思考過這樣一個問題:如果一個 key 已過期,但這個 key 還未被 master 清理,此時在 slave 上查詢這個 key,會返回什么結(jié)果呢?

  • slave 正常返回 key 的值

  • slave 返回 NULL

  • 你認(rèn)為是哪一種?可以思考一下。

    答案是:不一定

    嗯?為什么會不一定?

    這個問題非常有意思,請跟緊我的思路,我會帶你一步步分析其中的原因。

    其實,返回什么結(jié)果,這要取決于以下 3 個因素:

  • Redis 的版本

  • 具體執(zhí)行的命令

  • 機器時鐘

  • 先來看 Redis 版本。

    如果你使用的是 Redis 3.2 以下版本,只要這個 key 還未被 master 清理,那么,在 slave 上查詢這個 key,它會永遠返回 value 給你。

    也就是說,即使這個 key 已過期,在 slave 上依舊可以查詢到這個 key。

    //?Redis?2.8?版本?在?slave?上執(zhí)行 127.0.0.1:6479>?TTL?testkey (integer)?-2????//?已過期 127.0.0.1:6479>?GET?testkey "testval"???????//?還能查詢到!

    但如果此時在 master 上查詢這個 key,發(fā)現(xiàn)已經(jīng)過期,就會把它清理掉,然后返回 NULL。

    //?Redis?2.8?版本?在?master?上執(zhí)行 127.0.0.1:6379>?TTL?testkey (integer)?-2 127.0.0.1:6379>?GET?testkey (nil)

    發(fā)現(xiàn)了嗎?在 master 和 slave 上查詢同一個 key,結(jié)果竟然不一樣?

    其實,slave 應(yīng)該要與 master 保持一致,key 已過期,就應(yīng)該給客戶端返回 NULL,而不是還正常返回 key 的值。

    為什么會發(fā)生這種情況?

    其實這是 Redis 的一個 Bug:3.2 以下版本的 Redis,在 slave 上查詢一個 key 時,并不會判斷這個 key 是否已過期,而是直接無腦返回給客戶端結(jié)果。

    這個 Bug 在 3.2 版本進行了修復(fù),但是,它修復(fù)得「不夠徹底」。

    什么叫修復(fù)得「不夠徹底」?

    這就要結(jié)合前面提到的,第 2 個影響因素「具體執(zhí)行的命令」來解釋了。

    Redis 3.2 雖然修復(fù)了這個 Bug,但卻遺漏了一個命令:EXISTS。

    也就是說,一個 key 已過期,在 slave 直接查詢它的數(shù)據(jù),例如執(zhí)行 GET/LRANGE/HGETALL/SMEMBERS/ZRANGE 這類命令時,slave 會返回 NULL。

    但如果執(zhí)行的是 EXISTS,slave 依舊會返回:key 還存在。

    //?Redis?3.2?版本?在?slave?上執(zhí)行 127.0.0.1:6479>?GET?testkey (nil)???????????//?key?已邏輯過期 127.0.0.1:6479>?EXISTS?testkey (integer) 1 ????//?還存在!

    原因在于,EXISTS 與查詢數(shù)據(jù)的命令,使用的不是同一個方法。

    Redis 作者只在查詢數(shù)據(jù)時增加了過期時間的校驗,但 EXISTS 命令依舊沒有這么做。

    直到 Redis 4.0.11 這個版本,Redis 才真正把這個遺漏的 Bug 完全修復(fù)。

    如果你使用的是這個之上的版本,那在 slave 上執(zhí)行數(shù)據(jù)查詢或 EXISTS,對于已過期的 key,就都會返回「不存在」了。

    這里我們先小結(jié)一下,slave 查詢過期 key,經(jīng)歷了 3 個階段:

  • 3.2 以下版本,key 過期未被清理,無論哪個命令,查詢 slave,均正常返回 value

  • 3.2 - 4.0.11 版本,查詢數(shù)據(jù)返回 NULL,但 EXISTS 依舊返回 true

  • 4.0.11 以上版本,所有命令均已修復(fù),過期 key 在 slave 上查詢,均返回「不存在」

  • 這里要特別鳴謝《Redis開發(fā)與運維》的作者,付磊。

    這個問題我是在他的文章中看到的,感覺非常有趣,原來 Redis 之前還存在這樣的 Bug 。隨后我又查閱了相關(guān)源碼,并對邏輯進行了梳理,在這里才寫成文章分享給大家。

    雖然已在微信中親自答謝,但在這里再次表達對他的謝意~

    最后,我們來看影響查詢結(jié)果的第 3 個因素:「機器時鐘」。

    假設(shè)我們已規(guī)避了上面提到的版本 Bug,例如,我們使用 Redis 5.0 版本,在 slave 查詢一個 key,還會和 master 結(jié)果不同嗎?

    答案是,還是有可能會的。

    這就與 master / slave 的機器時鐘有關(guān)了。

    無論是 master 還是 slave,在判斷一個 key 是否過期時,都是基于「本機時鐘」來判斷的。

    如果 slave 的機器時鐘比 master 走得「快」,那就會導(dǎo)致,即使這個 key 還未過期,但以 slave 上視角來看,這個 key 其實已經(jīng)過期了,那客戶端在 slave 上查詢時,就會返回 NULL。

    是不是很有意思?一個小小的過期 key,竟然藏匿這么多貓膩。

    如果你也遇到了類似的情況,就可以通過上述步驟進行排查,確認(rèn)是否踩到了這個坑。

    3) 主從切換會導(dǎo)致緩存雪崩?

    這個問題是上一個問題的延伸。

    我們假設(shè),slave 的機器時鐘比 master 走得「快」,而且是「快很多」。

    此時,從 slave 角度來看,Redis 中的數(shù)據(jù)存在「大量過期」。

    如果此時操作「主從切換」,把 slave 提升為新的 master。

    它成為 master 后,就會開始大量清理過期 key,此時就會導(dǎo)致以下結(jié)果:

  • master 大量清理過期 key,主線程發(fā)生阻塞,無法及時處理客戶端請求

  • Redis 中數(shù)據(jù)大量過期,引發(fā)緩存雪崩

  • 你看,當(dāng) master / slave 機器時鐘嚴(yán)重不一致時,對業(yè)務(wù)的影響非常大!

    所以,如果你是 DBA 運維,一定要保證主從庫的機器時鐘一致性,避免發(fā)生這些問題。

    4) master / slave 大量數(shù)據(jù)不一致?

    還有一種場景,會導(dǎo)致 master / slave 的數(shù)據(jù)存在大量不一致。

    這就涉及到 Redis 的 maxmemory 配置了。

    Redis 的 maxmemory 可以控制整個實例的內(nèi)存使用上限,超過這個上限,并且配置了淘汰策略,那么實例就開始淘汰數(shù)據(jù)。

    但這里有個問題:假設(shè) master / slave 配置的 maxmemory 不一樣,那此時就會發(fā)生數(shù)據(jù)不一致。

    例如,master 配置的 maxmemory 為 5G,而 slave 的 maxmemory 為 3G,當(dāng) Redis 中的數(shù)據(jù)超過 3G 時,slave 就會「提前」開始淘汰數(shù)據(jù),此時主從庫數(shù)據(jù)發(fā)生不一致。

    另外,盡管 master / slave 設(shè)置的 maxmemory 相同,如果你要調(diào)整它們的上限,也要格外注意,否則也會導(dǎo)致 slave 淘汰數(shù)據(jù):

    • 調(diào)大 maxmemory 時,先調(diào)整 slave,再調(diào)整 master

    • 調(diào)小 maxmemory 時,先調(diào)整 master,再調(diào)整 slave

    以此方式操作,就避免了 slave 提前超過 maxmemory 的問題。

    其實,你可以思考一下,發(fā)生這些問題的關(guān)鍵在哪?

    其根本原因在于,slave 超過 maxmemory 后,會「自行」淘汰數(shù)據(jù)。

    如果不讓 slave 自己淘汰數(shù)據(jù),那這些問題是不是都可以規(guī)避了?

    沒錯。

    針對這個問題,Redis 官方應(yīng)該也收到了很多用戶的反饋。在 Redis 5.0 版本,官方終于把這個問題徹底解決了!

    Redis 5.0 增加了一個配置項:replica-ignore-maxmemory,默認(rèn) yes。

    這個參數(shù)表示,盡管 slave 內(nèi)存超過了 maxmemory,也不會自行淘汰數(shù)據(jù)了!

    這樣一來,slave 永遠會向 master 看齊,只會老老實實地復(fù)制 master 發(fā)送過來的數(shù)據(jù),不會自己再搞「小動作」。

    至此,master / slave 的數(shù)據(jù)就可以保證完全一致了!

    如果你使用的恰好是 5.0 版本,就不用擔(dān)心這個問題了。

    5) slave 竟然會有內(nèi)存泄露問題?

    是的,你沒看錯。

    這是怎么發(fā)生的?我們具體來看一下。

    當(dāng)你在使用 Redis 時,符合以下場景,就會觸發(fā) slave 內(nèi)存泄露:

    • Redis 使用的是 4.0 以下版本

    • slave 配置項為 read-only=no(從庫可寫)

    • 向 slave 寫入了有過期時間的 key

    這時的 slave 就會發(fā)生內(nèi)存泄露:slave 中的 key,即使到了過期時間,也不會自動清理。

    如果你不主動刪除它,那這些 key 就會一直殘留在 slave 內(nèi)存中,消耗 slave 的內(nèi)存。

    最麻煩的是,你使用命令查詢這些 key,卻還查不到任何結(jié)果!

    這就 slave 「內(nèi)存泄露」問題。

    這其實也是 Redis 的一個 Bug,Redis 4.0 才修復(fù)了這個問題。

    解決方案是,在可寫的 slave 上,寫入帶有過期時間 key 時,slave 會「記錄」下來這些 key。

    然后 slave 會定時掃描這些 key,如果到達過期時間,則清理之。

    如果你的業(yè)務(wù)需要在 slave 上臨時存儲數(shù)據(jù),而且這些 key 也都設(shè)置了過期時間,那么就要注意這個問題了。

    你需要確認(rèn)你的 Redis 版本,如果是 4.0 以下版本,一定要避免踩這個坑。

    其實,最好的方案是,制定一個 Redis 使用規(guī)范,slave 必須強制設(shè)置為 read-only,不允許寫,這樣不僅可以保證 master / slave 的數(shù)據(jù)一致性,還避免了 slave 內(nèi)存泄露問題。

    6) 為什么主從全量同步一直失敗?

    在主從全量同步時,你可能會遇到同步失敗的問題,具體場景如下:

    slave 向 master 發(fā)起全量同步請求,master 生成 RDB 后發(fā)給 slave,slave 加載 RDB。

    由于 RDB 數(shù)據(jù)太大,slave 加載耗時也會變得很長。

    此時你會發(fā)現(xiàn),slave 加載 RDB 還未完成,master 和 slave 的連接卻斷開了,數(shù)據(jù)同步也失敗了。

    之后你又會發(fā)現(xiàn),slave 又發(fā)起了全量同步,master 又生成 RDB 發(fā)送給 slave。

    同樣地,slave 在加載 RDB 時,master / slave 同步又失敗了,以此往復(fù)。

    這是怎么回事?

    其實,這就是 Redis 的「復(fù)制風(fēng)暴」問題。

    什么是復(fù)制風(fēng)暴?

    就像剛才描述的:主從全量同步失敗,又重新開始同步,之后又同步失敗,以此往復(fù),惡性循環(huán),持續(xù)浪費機器資源。

    為什么會導(dǎo)致這種問題呢?

    如果你的 Redis 有以下特點,就有可能發(fā)生這種問題:

    • master 的實例數(shù)據(jù)過大,slave 在加載 RDB 時耗時太長

    • 復(fù)制緩沖區(qū)(slave client-output-buffer-limit)配置過小

    • master 寫請求量很大

    主從在全量同步數(shù)據(jù)時,master 接收到的寫請求,會先寫到主從「復(fù)制緩沖區(qū)」中,這個緩沖區(qū)的「上限」是配置決定的。

    當(dāng) slave 加載 RDB 太慢時,就會導(dǎo)致 slave 無法及時讀取「復(fù)制緩沖區(qū)」的數(shù)據(jù),這就引發(fā)了復(fù)制緩沖區(qū)「溢出」。

    為了避免內(nèi)存持續(xù)增長,此時的 master 會「強制」斷開 slave 的連接,這時全量同步就會失敗。

    之后,同步失敗的 slave 又會「重新」發(fā)起全量同步,進而又陷入上面描述的問題中,以此往復(fù),惡性循環(huán),這就是所謂的「復(fù)制風(fēng)暴」。

    如何解決這個問題呢?我給你以下幾點建議:

  • Redis 實例不要太大,避免過大的 RDB

  • 復(fù)制緩沖區(qū)配置的盡量大一些,給 slave 加載 RDB 留足時間,降低全量同步失敗的概率

  • 如果你也踩到了這個坑,可以通過這個方案來解決。

    總結(jié)

    好了,總結(jié)一下,這篇文章我們主要講了 Redis 在「命令使用」、「數(shù)據(jù)持久化」、「主從同步」3 個方面可能存在的「坑」。

    怎么樣?有沒有顛覆你的認(rèn)知呢?

    這篇文章信息量還是比較大的,如果你現(xiàn)在的思維已經(jīng)有些「凌亂」了,別急,我也給你準(zhǔn)備好了思維導(dǎo)圖,方便你更好地理解和記憶。

    希望你在使用 Redis 時,可以提前規(guī)避這些坑,讓 Redis 更好地提供服務(wù)。

    后記

    最后,我想和你聊一聊在開發(fā)過程中,關(guān)于踩坑的經(jīng)驗和心得。

    其實,接觸任何一個新領(lǐng)域,都會經(jīng)歷陌生、熟悉、踩坑、吸收經(jīng)驗、游刃有余這幾個階段。

    那在踩坑這個階段,如何少踩坑?或者踩坑后如何高效率地排查問題呢?

    這里我總結(jié)出了 4 個方面,應(yīng)該可以幫助到你:

    1) 多看官方文檔 + 配置文件的注釋

    一定要多看官方文檔,以及配置文件的注釋說明。其實很多可能存在風(fēng)險的地方,優(yōu)秀的軟件都會在文檔和注釋里提示你的,認(rèn)真讀一讀,可以提前規(guī)避很多基礎(chǔ)問題。

    2) 不放過疑問細節(jié),多思考為什么?

    永遠要保持好奇心。遇到問題,掌握剝絲抽繭,逐步定位問題的能力,時刻保持探尋事物問題本質(zhì)的心態(tài)。

    3) 敢于提出質(zhì)疑,源碼不會騙人

    如果你覺得一個問題很蹊蹺,可能是一個 Bug,要敢于提出質(zhì)疑。

    通過源碼尋找問題的真相,這種方式要好過你看一百篇網(wǎng)上互相抄襲的文章(抄來抄去很有可能都是錯的)。

    4) 沒有完美的軟件,優(yōu)秀軟件都是一步步迭代出來的

    任何優(yōu)秀的軟件,都是一步步迭代出來的。在迭代過程中,存在 Bug 很正常,我們需要抱著正確的心態(tài)去看待它。

    這些經(jīng)驗和心得,適用于學(xué)習(xí)任何領(lǐng)域,希望對你有所幫助

    總結(jié)

    以上是生活随笔為你收集整理的Redis会遇到的15个「坑」,你踩过几个?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    91理论片午午伦夜理片久久 | 欧美成人精品欧美一级乱黄 | 国产自产在线视频 | 天天综合五月天 | 国产精品久久综合 | 香蕉久久久久久av成人 | 亚洲性xxxx | 五月天婷婷在线观看视频 | av亚洲产国偷v产偷v自拍小说 | 欧美在线一二区 | 国产日韩视频在线 | 婷婷丁香国产 | 麻花天美星空视频 | 国产精品久久久久婷婷二区次 | 久久www免费人成看片高清 | 中文字幕免费高清在线 | 国产一区二区在线免费 | 国产精品v欧美精品v日韩 | 日韩午夜剧场 | 麻豆免费视频网站 | 伊人天堂网 | 一二三区高清 | 日韩视频在线不卡 | 在线小视频 | 国产午夜av| 综合激情伊人 | 在线免费观看黄色小说 | 五月激情视频 | 伊香蕉大综综综合久久啪 | 二区三区中文字幕 | 日韩在线观看视频中文字幕 | 国产尤物一区二区三区 | 波多野结衣在线观看视频 | 成人午夜电影免费在线观看 | av资源免费观看 | 欧美成人影音 | 日本黄色一级电影 | 欧美色图p| 欧美少妇bbwhd | 爱av在线网 | 色欧美成人精品a∨在线观看 | 免费看片网址 | 亚洲精品国产视频 | 久草香蕉在线 | 免费看黄的 | 精品少妇一区二区三区在线 | 天天天天射 | 99视频99| 91黄色小网站 | 国产精品一二三 | 亚洲春色综合另类校园电影 | 色五丁香 | 亚洲高清91 | 国产女v资源在线观看 | 蜜臀久久99精品久久久无需会员 | 成人一区二区三区在线观看 | 黄色成人影院 | 国产女人免费看a级丨片 | 丁香花在线视频观看免费 | www.五月天 | 久久精品中文字幕少妇 | 中文字幕一区二区在线观看 | 欧美精品一区二区性色 | a视频免费| av怡红院| 国产三级av在线 | 51精品国自产在线 | 少妇视频在线播放 | 免费无遮挡动漫网站 | 国产不卡在线看 | 国产精品自产拍在线观看中文 | 亚洲一区二区视频在线播放 | 五月天婷婷综合 | 精品成人国产 | 国产三级视频 | 日本成址在线观看 | 99久久精品网 | 91视频91自拍 | 毛片播放网站 | 中文字幕成人av | 久久av一区二区三区亚洲 | 久久国产电影 | 久久综合欧美精品亚洲一区 | 99国产精品一区 | 在线免费观看国产视频 | 成人性生交大片免费看中文网站 | 在线观看电影av | 综合久久久久久 | 黄在线免费看 | 欧美日韩国产三级 | 亚洲综合在线视频 | 亚洲五月婷 | 日韩精品在线观看av | 亚洲一级片| 91成人精品一区在线播放69 | av在线免费观看黄 | 欧美 亚洲 另类 激情 另类 | 91在线区 | 国产小视频91 | 国产91电影在线观看 | 国产午夜精品免费一区二区三区视频 | 精品视频不卡 | 久久久网 | 永久免费av在线播放 | 国产一区电影在线观看 | 人人盈棋牌 | 99亚洲国产精品 | av夜夜操| 久久精品99国产精品酒店日本 | 新版资源中文在线观看 | 九九热视频在线播放 | 欧美精品视 | 色网站免费在线看 | 亚洲国产高清在线观看视频 | 丁香婷婷激情国产高清秒播 | 日日爽天天爽 | 在线观看中文字幕dvd播放 | 国产成人一区二区三区 | 开心丁香婷婷深爱五月 | 日韩精品在线视频免费观看 | 在线免费观看一区二区三区 | 亚洲成熟女人毛片在线 | 97香蕉久久超级碰碰高清版 | 国产专区视频在线观看 | 伊人天堂网 | 久草在线最新 | 久久久久五月天 | 中文字幕亚洲在线观看 | 久久婷亚洲五月一区天天躁 | 高清在线观看av | 成人在线一区二区三区 | 久草在线免费看视频 | 久久精品韩国 | 日日夜色 | 国产中文字幕在线看 | 在线观看国产91 | 亚洲免费国产视频 | 成人欧美一区二区三区黑人麻豆 | 狠狠网亚洲精品 | 中文字幕频道 | 五月婷婷.com | 天天操天天色天天 | 日本精品久久久久 | 国偷自产视频一区二区久 | 中文字幕国产一区 | 日韩女同一区二区三区在线观看 | 中文字幕有码在线观看 | 国产中文欧美日韩在线 | 久久久久激情视频 | www.人人草 | 国产精品嫩草69影院 | 精油按摩av | 国产资源在线播放 | 91在线观看视频网站 | 中文字幕亚洲精品在线观看 | 久久黄色片子 | 久久免费高清 | 日韩中文三级 | 欧美精品久久人人躁人人爽 | 中文字幕丝袜制服 | 亚洲综合色视频在线观看 | 91精品免费视频 | 一级黄色大片在线观看 | 亚洲日本在线视频观看 | 免费日韩 精品中文字幕视频在线 | 国内一区二区视频 | 国产清纯在线 | 麻豆国产视频 | 欧美成人理伦片 | av在线播放亚洲 | 午夜黄网| 免费成人在线网站 | 一级国产视频 | a在线免费 | 国产精品九九久久久久久久 | 久久久综合香蕉尹人综合网 | 欧美日本啪啪无遮挡网站 | 成人在线播放av | 97精品国产91久久久久久 | 操操操操网 | 午夜视频免费在线观看 | 欧美日韩亚洲在线观看 | 在线观看久久 | 91精品久久久久久综合乱菊 | 久久精品女人毛片国产 | 在线观看免费av网站 | 制服丝袜一区二区 | 毛片网站免费在线观看 | 96在线| 国产精品亚洲a | 精品a在线| 日本黄色免费观看 | 日韩在线理论 | 在线观看国产一区二区 | 日韩成人在线免费观看 | 国产精品12345 | 亚洲精品网页 | 亚洲欧美一区二区三区孕妇写真 | 911香蕉| 成人精品久久 | 日韩 国产| 色国产精品 | 波多野结衣日韩 | 亚洲视频免费在线观看 | 精品视频免费观看 | 国产日韩欧美精品在线观看 | 久久伊人国产精品 | av中文字幕在线电影 | 亚洲精品中文在线 | 久久精品xxx| 午夜久久久久久久 | 国产精品1024 | 91爱爱中文字幕 | 成人黄色在线观看视频 | 92av视频| 91精品视频免费在线观看 | 国内精自线一二区永久 | 在线电影a | 成年人免费观看在线视频 | 免费在线观看亚洲视频 | 国产一区二区三区久久久 | 久99久精品视频免费观看 | www.亚洲视频.com | 最近中文字幕免费av | 五月天婷婷狠狠 | 国产一区二区不卡在线 | 久久不射电影院 | 国产欧美日韩一区 | 在线播放亚洲 | 99亚洲视频 | 悠悠av资源片 | 久久tv视频 | 免费观看的黄色 | 日韩网站视频 | 成人动漫一区二区三区 | 麻豆国产精品va在线观看不卡 | 成年在线观看 | 88av色| 97成人免费| 久久久久国产免费免费 | 九九热精品视频在线观看 | 黄色av高清 | 欧美精品久久人人躁人人爽 | 在线黄色国产电影 | 欧美色伊人 | 91成人在线看| 视频一区亚洲 | www91在线| 精品久久影院 | 黄色大片视频网站 | 日日摸日日添日日躁av | 欧美 日韩 成人 | 亚洲激情电影在线 | 亚洲欧美日韩国产一区二区 | av电影一区二区三区 | 久久成人麻豆午夜电影 | 国产一区视频免费在线观看 | 午夜电影久久久 | 91精品爽啪蜜夜国产在线播放 | 人人狠狠 | 国产成人精品综合久久久久99 | 国产91综合一区在线观看 | 亚洲一级性 | 999国产精品视频 | 久久久久久美女 | 久久久91精品国产一区二区三区 | 亚洲日本va中文字幕 | 欧美精品三级 | 国产美女被啪进深处喷白浆视频 | 二区三区在线视频 | 欧美片一区二区三区 | 高清国产午夜精品久久久久久 | 欧美老少交 | 狠狠色丁香婷婷综合视频 | 亚洲夜夜网 | 日本中文字幕在线看 | 天天射天天射 | 久久这里精品视频 | 色综合久久久网 | 福利视频区 | 日韩电影一区二区三区在线观看 | 亚洲精品乱码久久久久 | 久久综合色一综合色88 | 中文不卡视频在线 | 91精选在线 | 久草热视频 | 精品一二区 | 国产特级毛片aaaaaa毛片 | 久久精品爱爱视频 | 又污又黄网站 | 欧美91精品久久久久国产性生爱 | 97精品国产91久久久久久 | 国产码电影 | 久草精品网 | 日韩欧三级 | 色婷婷骚婷婷 | 成年人国产在线观看 | 国产精品扒开做爽爽的视频 | 一区精品久久 | www激情网 | 黄色综合 | 午夜精品电影 | 99精品在线免费在线观看 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 91| 国产色综合 | 久草在线99 | 片网站| 国产色黄网站 | 欧美一区日韩一区 | 久久成人国产精品 | 在线免费观看国产视频 | 一区二区三区精品在线视频 | 中文字幕乱码电影 | 五月综合网 | 人人玩人人添人人澡超碰 | 国产 中文 日韩 欧美 | 久久久久草 | 开心激情五月网 | 91精品国产九九九久久久亚洲 | 成年人免费在线观看网站 | 久久99国产精品久久99 | 91精品国产乱码久久 | 久久综合色一综合色88 | 日韩视频欧美视频 | 视频在线播放国产 | 超碰国产97| 久久综合久色欧美综合狠狠 | 国产精品18p| 丁香av| 欧美男男激情videos | 天天综合成人网 | 成人h动漫在线看 | 久久中文欧美 | 天天干天天天天 | 国产做aⅴ在线视频播放 | 日韩精品欧美视频 | 国产成人综合精品 | 伊人亚洲精品 | 婷婷av网站 | 伊人中文字幕在线 | 日本精品视频在线观看 | 九九热有精品 | 黄a在线| 久久永久视频 | 国产成人av在线 | 欧美黄色特级片 | 国产高清视频免费在线观看 | 2021久久| 久久国产亚洲精品 | 超碰在线最新地址 | 99一级片| 又黄又爽的免费高潮视频 | 国产精品国产三级国产不产一地 | 久久久久久久久福利 | 香蕉视频在线免费 | 精品久久一区二区 | 毛片网站在线观看 | 免费av观看网站 | 国产一级二级在线 | 精品综合久久久 | 国产精品毛片久久 | 狠狠狠狠狠色综合 | 久久99国产视频 | 中文在线天堂资源 | 精品久久久久久久久久岛国gif | 六月丁香社区 | 色狠狠综合天天综合综合 | 久久免费中文视频 | 在线观看av大片 | 亚洲一区二区三区毛片 | 91精品啪在线观看国产81旧版 | 欧美二区视频 | 国产欧美在线一区二区三区 | 国产又粗又猛又爽又黄的视频免费 | 亚洲精品一区二区三区四区高清 | 国产96在线 | 久久久色| 日韩欧美视频在线 | 国产精品人成电影在线观看 | 黄色电影网站在线观看 | 亚洲精品福利在线观看 | 婷婷综合久久 | 成年人免费看的视频 | 亚洲精品视频中文字幕 | 国产99久久精品一区二区300 | www.五月天婷婷 | 欧美91片| av电影不卡 | 日日干日日色 | 天天弄天天操 | 99精品免费久久久久久久久日本 | 亚洲视频在线免费观看 | 在线观看视频你懂 | 欧美一级性视频 | 亚洲激情在线观看 | 日日夜夜综合网 | 免费看国产曰批40分钟 | 顶级bbw搡bbbb搡bbbb | 国产一区二区高清视频 | 中文字幕一区二区在线观看 | 成年人在线免费视频观看 | 久草线 | 天堂素人在线 | 亚洲色五月 | 毛片播放网站 | 久久精品国产美女 | 久久久久久久亚洲精品 | 日韩中文字幕免费在线播放 | 欧美一级片 | 国产成人高清 | 国产精品1区 | 久久99久久精品 | 97电影在线看视频 | 国产又黄又爽又猛视频日本 | 亚洲资源网 | 91在线麻豆 | 天天天插| 九九免费在线观看视频 | 日本一区二区三区视频在线播放 | 在线观看视频你懂 | 日韩高清一二三区 | 在线观看91久久久久久 | 二区精品视频 | 在线看片中文字幕 | 国产成人在线精品 | 欧美有色 | 视频二区在线 | 日本久久综合网 | 久久精品一区八戒影视 | 欧美成人日韩 | 综合色伊人| 天天色婷婷 | 国产精品久久久久久久久久久免费 | 国产精品久久久久亚洲影视 | 久久国产精品系列 | 国产精品日韩久久久久 | 四虎www. | 成人黄性视频 | 四虎成人精品永久免费av九九 | 网址你懂的在线观看 | 精品久久久影院 | 国产女人免费看a级丨片 | 亚洲国产精品成人女人久久 | 欧洲精品视频一区 | 久久成 | 久久精品8 | 丁香六月婷婷综合 | 黄色成人在线网站 | 日韩在线第一 | 99精品免费久久久久久久久 | 欧美最新另类人妖 | 精品国产乱码久久久久久1区2匹 | 精品国产免费一区二区三区五区 | 中国一级片在线观看 | 成人一区影院 | 国产精品美 | 国产精品永久在线观看 | 日本久久久久久 | 国产精品电影一区二区 | 成年人黄色免费视频 | 日韩av一区二区三区四区 | 国产一级精品绿帽视频 | 在线播放精品一区二区三区 | 日韩a级黄色片 | 久久精品综合一区 | 久草热久草视频 | 在线观看精品国产 | av一区在线播放 | 免费在线观看日韩欧美 | 国产精品色视频 | 日日摸日日 | 日本中文字幕久久 | 国产精品九九九九九九 | 亚洲永久精品在线 | 黄色免费在线看 | 深夜国产福利 | 亚洲成人精品影院 | 在线影院av| 中文不卡视频 | 婷婷国产在线 | 亚洲国产中文字幕在线观看 | 亚洲欧美日韩在线一区二区 | 又黄又爽的免费高潮视频 | 激情网站免费观看 | 性色在线视频 | 成年人免费av网站 | 国产成人精品久久二区二区 | 欧美日韩有码 | 日韩精品久久一区二区三区 | 日韩在线电影观看 | 九草在线观看 | 亚洲午夜激情网 | 国产伦精品一区二区三区高清 | 黄色一二级片 | 人人爽人人爽人人片av | 成年人电影免费在线观看 | 国产精品久久久久久久久久不蜜月 | 国产一区二区播放 | 日b视频在线观看网址 | 99r在线精品 | 国产一级片免费观看 | 免费视频一二三区 | 中文字幕在线日本 | av黄免费看 | 97天天综合网 | 久久五月精品 | 久久视频在线观看中文字幕 | 亚洲一区二区三区91 | 久久手机视频 | 九九天堂 | 国产成人在线网站 | 99精品在线免费 | 在线观看精品黄av片免费 | 日日夜夜婷婷 | 国产视频2区 | 国产视频精品久久 | 成人丝袜 | 国产精品成人一区二区三区吃奶 | 国产福利午夜 | 国产精品嫩草影视久久久 | 一区视频在线 | 成人av播放 | 国产视频精品免费播放 | 国产专区视频在线 | 亚洲视频播放 | 精壮的侍卫呻吟h | 成人在线观看日韩 | 国产亚洲精品久久久久久大师 | 日韩视频在线一区 | 国产精品不卡在线 | www.人人草 | 激情视频免费观看 | 精品视频www | 婷婷色综 | 久久伊人精品一区二区三区 | 久久精品国产一区二区三区 | 在线观看的av网站 | 日韩欧美一区二区在线观看 | 激情久久久久久久久久久久久久久久 | 久久欧美视频 | 91精品视频免费看 | 99精品视频在线观看 | 久久成人视屏 | 久久97久久 | 国产精品久久久久久久久久久久 | 在线精品视频在线观看高清 | 狠狠色丁香久久婷婷综 | 亚欧洲精品视频在线观看 | 久久免费毛片视频 | 日黄网站| 美女黄视频免费 | 最近日韩免费视频 | 色婷婷福利视频 | 中文字幕影片免费在线观看 | 国产很黄很色的视频 | 在线视频电影 | 日韩美女av在线 | 国产高清精| 久香蕉| 一本一本久久a久久精品综合小说 | 黄色三级在线观看 | 日本精品在线看 | 婷婷色网视频在线播放 | 午夜精品在线看 | 开心色插 | 欧美色图30p | 免费福利在线观看 | 日本精品在线看 | 97自拍超碰| 久久午夜影视 | 一色屋精品视频在线观看 | 狠狠干狠狠色 | 欧美亚洲成人xxx | 日日麻批40分钟视频免费观看 | 96av麻豆蜜桃一区二区 | 国产精品一区二区三区观看 | 成人a级黄色片 | 色在线网站 | 超碰人人草人人 | 玖玖999 | 欧美日韩一区二区在线 | 91中文字幕在线观看 | 91久久久久久久一区二区 | 久久黄色影院 | 国产精品96久久久久久吹潮 | 黄色成人毛片 | 黄色在线免费观看网址 | 国产亚洲精品成人av久久ww | 91精品日韩| 网址你懂的在线观看 | 久青草电影 | 午夜婷婷综合 | 午夜18视频在线观看 | 日韩aⅴ视频 | 亚洲精品在线观看网站 | 日韩a在线观看 | 在线观看涩涩 | 午夜影视av | 波多野结衣在线观看视频 | 亚洲国产高清在线观看视频 | 欧美日韩一区二区三区视频 | 在线观看av片| 久久久免费看 | 天天做天天爱天天综合网 | 国产久草在线观看 | 欧美污在线观看 | 久久视频免费观看 | 永久精品视频 | 毛片视频网址 | 久久精品2| 97视频免费 | 中文字幕在线观看第一区 | 日b视频国产 | 久草在线观看视频免费 | 亚洲视频播放 | 国产一区二区电影在线观看 | 99久久影院| 国产 日韩 欧美 在线 | 亚洲爱av | 国产精品免费久久 | 四虎影视国产精品免费久久 | 国产精品黄网站在线观看 | 国产又黄又爽无遮挡 | 日韩欧美国产精品 | 91精品欧美 | 国产在线观看99 | 午夜电影久久久 | 久久福利影视 | 狠狠干狠狠艹 | 国产精品一区二区在线观看免费 | 国产一级一级国产 | av中文字幕亚洲 | 久久欧美在线电影 | 五月婷久 | 中文字幕视频三区 | www.久草.com| 欧美一级电影在线观看 | 日日操夜 | 日韩av电影网站在线观看 | 国产乱对白刺激视频在线观看女王 | av 一区 二区 久久 | 中文字幕在线观看播放 | 91av综合| 久久影视一区 | 欧美怡红院视频 | 美女免费电影 | 999久久国产精品免费观看网站 | 久久99最新地址 | 国产69精品久久久久99尤 | 成人小视频在线观看免费 | 免费精品视频在线观看 | 精品99在线 | 91成人精品一区在线播放69 | 99视频偷窥在线精品国自产拍 | www..com毛片| 国内精品久久久久久久影视简单 | 九九视频免费在线观看 | 日韩黄色中文字幕 | 久久综合色播五月 | 国产精品一区欧美 | 久久艹影院 | 1区2区3区在线观看 三级动图 | 中文有码在线 | 亚洲精品视频在 | 亚洲精品字幕在线观看 | 成人国产网站 | 国产精品美女视频网站 | 色五月情 | 久久成人免费电影 | 91视频在线网址 | 九九热在线免费观看 | 美女网站在线 | 91麻豆免费版| 久久精品国产精品亚洲 | 国产成人综合图片 | 激情视频国产 | 久久艹99 | 香蕉视频在线观看免费 | 久久久久久久久久久久久久av | 国产精品久久久久aaaa | 国产高清亚洲 | 精品国产99| 久久深夜福利免费观看 | 久久久久免费看 | 亚洲一二区视频 | 99热精品在线观看 | 天堂va欧美va亚洲va老司机 | 五月天婷婷在线视频 | 日韩av一区在线观看 | 久久免视频| 久久久999| 五月天婷亚洲天综合网鲁鲁鲁 | 日韩影视在线观看 | 91在线免费看片 | 久久人人爽人人人人片 | 免费在线一区二区三区 | 手机在线黄色网址 | av色图天堂网 | 久久天天躁夜夜躁狠狠躁2022 | 91传媒免费在线观看 | 婷婷色站| 中文字幕在线观看的网站 | 蜜臀久久99精品久久久无需会员 | 婷婷视频在线观看 | 婷婷视频| 这里有精品在线视频 | 一区在线观看视频 | 成人午夜影视 | 日本天天操 | 欧美99久久 | 国产精品国产三级国产不产一地 | 日韩久久久久久久久久久久 | 日本特黄一级 | 日韩高清在线一区 | 精品在线亚洲视频 | 亚洲色图激情文学 | 日韩三级免费 | 探花视频在线观看+在线播放 | 久草在线资源免费 | 黄色毛片观看 | 国产色在线观看 | 日韩r级电影在线观看 | 免费观看一级视频 | 久久99视频精品 | 黄色一级在线免费观看 | 国产一卡二卡四卡国 | 欧美一级性生活片 | 国产美女精彩久久 | 亚洲电影av在线 | 精品久久电影 | 成人亚洲精品国产www | 免费在线观看av电影 | 在线亚洲免费视频 | www.夜夜爽 | www中文在线 | 激情久久久久久久久久久久久久久久 | 欧美激情精品一区 | 国产视频每日更新 | 五月婷婷视频在线 | 国产精品 亚洲精品 | 中文在线8资源库 | 亚洲精品视频在线观看免费视频 | 亚洲免费a | 欧美伦理一区二区三区 | 超碰人人草人人 | 国产少妇在线观看 | 午夜精品久久久久久久久久久久久久 | 很黄很污的视频网站 | 97超碰人人模人人人爽人人爱 | 99色网站 | 99热在线观看 | 成人免费在线观看电影 | 欧美福利片在线观看 | 亚洲黄色成人av | 黄p在线播放 | 少妇性色午夜淫片aaaze | 精品国产视频一区 | 国产精品久久人 | 午夜精品久久久久久中宇69 | 亚洲综合色av | 日韩成年视频 | 国产精品久久久久久久免费大片 | 蜜臀久久99静品久久久久久 | 日韩免费电影网 | 久久免费视频在线观看 | 热久久最新地址 | 久久草在线视频国产 | 亚洲狠狠婷婷 | 欧美日韩伦理在线 | 丰满少妇在线观看 | 91片在线观看| 四虎最新域名 | 美女视频黄的免费的 | 国产亚洲资源 | 精品v亚洲v欧美v高清v | 国产香蕉久久 | 波多野结衣在线观看一区二区三区 | 97视频在线免费观看 | 天天操夜夜操天天射 | av短片在线观看 | 偷拍精品一区二区三区 | 日韩极品在线 | 干综合网 | 91色偷偷 | 国产一二三区av | 欧美激情视频三区 | 欧美日韩国产一区二区三区在线观看 | 亚洲禁18久人片 | 一区二区影视 | 亚洲久草在线视频 | 亚洲一区天堂 | 成人在线视频一区 | 97在线播放视频 | 99热这里只有精品在线观看 | 成人资源网 | 国产精品一级视频 | 日本久久成人中文字幕电影 | 国产精品成久久久久 | 在线天堂中文www视软件 | 久久国产免费 | 成人91在线| 香蕉网站在线观看 | 久久久国产精品久久久 | 欧美人牲 | 玖玖在线播放 | 99视频在线精品 | 亚洲国产wwwccc36天堂 | 成人免费观看在线视频 | 日韩欧美一区二区三区在线观看 | 在线观看岛国av | 亚洲3级| 久久人人射 | 91视频在线自拍 | 99视频国产精品免费观看 | 午夜丰满寂寞少妇精品 | 91麻豆精品国产自产在线游戏 | 欧美一区在线看 | 成人av电影免费在线播放 | 日韩精品资源 | 亚洲精品色视频 | 亚洲乱亚洲乱亚洲 | 成人免费视频网站 | 激情综合网色播五月 | 五月天色丁香 | 欧美日韩在线观看一区 | 日韩av免费一区二区 | 精品国产自在精品国产精野外直播 | 日韩一级电影在线 | 九九热久久免费视频 | 国产原创在线 | a亚洲视频 | 天天天天天天天操 | 久久这里只有精品视频首页 | 91你懂的 | 五月婷婷色丁香 | 天天爱天天操天天干 | 中文字幕日韩在线播放 | 激情开心网站 | 欧美色婷| 精品国产免费一区二区三区五区 | av九九| 99久久精品国产亚洲 | 最新91在线视频 | 欧美性色综合网站 | 就要色综合 | 国产免费大片 | 热久久最新地址 | 久久久久久久久久久久久久av | 亚洲精品美女视频 | 欧美日韩久久一区 | 成人黄性视频 | 国产在线黄色 | 天天操人人干 | 色噜噜日韩精品欧美一区二区 | 久久精品一二三 | 最新成人av | 亚欧日韩成人h片 | 韩国av一区二区三区在线观看 | 国产无遮挡又黄又爽馒头漫画 | 五月天国产 | 五月天激情开心 | 91av在线免费 | 美女福利视频一区二区 | 免费一级黄色 | 亚洲成人精品在线 | 狠狠狠色丁香婷婷综合久久五月 | 亚洲激情 欧美激情 | 日韩午夜电影 | 日韩精品一区二区三区第95 | 久久免费视频观看 | 在线免费视频 你懂得 | 国产高清在线精品 | 久久精品日产第一区二区三区乱码 | 国产视频1区2区 | 国产女教师精品久久av | 亚洲最大免费成人网 | 91人人澡 | 精品国产久 | 99爱精品在线| 99久久精品午夜一区二区小说 | 久操中文字幕在线观看 | 久久久久97国产 | 免费观看9x视频网站在线观看 | 国产精品理论视频 | 中文字幕高清在线 | 亚洲高清视频在线播放 | 日韩在线免费高清视频 | 91中文在线视频 | 精品国产一区二区三区不卡 | 亚洲三级黄 | 又湿又紧又大又爽a视频国产 | 亚洲a在线观看 | 亚洲乱码在线观看 | 天天爽夜夜爽人人爽一区二区 | av一区在线 | 黄色片视频在线观看 | 国产精品女人久久久 | 中文字幕欧美日韩va免费视频 | 综合久久久久久久久 | av在线色 | 91重口视频| 午夜精品一区二区三区免费视频 | 免费视频一区二区 | 五月婷婷深开心 | 久久天天操 | 五月婷婷丁香激情 | 国产精品久99 | 麻豆国产电影 | 国产91精品高清一区二区三区 | 日韩欧美在线一区二区 | 国产日本在线播放 | 亚洲第一中文字幕 | 99视频这里有精品 | 国产在线观看免费观看 | 国产成人91 | 欧美一级在线看 | 亚洲欧美日韩精品久久奇米一区 | 六月丁香激情综合 | 国产美女视频免费观看的网站 | 婷婷六月天综合 | 日韩国产精品一区 | 18女毛片 | 四虎国产精品成人免费影视 | 99久久这里有精品 | 狠狠的操| 色婷婷久久 | 黄色网址中文字幕 | 三级在线视频观看 | 欧美日韩高清免费 | 国产精品毛片一区二区在线 | av无限看| 天天操 夜夜操 | 一二三四精品 | 色网av| 日韩伦理片一区二区三区 | 大胆欧美gogo免费视频一二区 | 制服丝袜成人在线 | 国产色啪| 国产 日韩 在线 亚洲 字幕 中文 | 在线观看免费91 | 区一区二区三在线观看 | 成人午夜网址 | 狠狠色丁香久久婷婷综 | 日韩一级片观看 | 久久字幕网 | 在线观看日韩精品 | 国产一区二区视频在线 | 国产综合在线视频 | 91成年视频 | 夜夜骑天天操 | av电影一区 | 在线黄频 | 亚洲精品视频大全 | 日韩欧美在线免费 | 91丨九色丨高潮 | 日韩高清三区 | 夜夜夜夜爽 | 视频二区在线 | 91在线视频观看免费 | 亚洲欧洲国产视频 | 992tv在线| 久久一二三四 | 国产精品一区二区久久精品爱微奶 | 久久久久国产一区二区 | 日本黄色黄网站 | 日韩中文字幕免费电影 | 国内精品视频在线 | 人人插人人 | 国产福利免费在线观看 | 91精品秘密在线观看 | 婷婷丁香色综合狠狠色 | 欧美性视频网站 | 激情欧美一区二区免费视频 | 岛国片在线 | 97国产在线观看 | av色网站| 超碰97免费 | 欧美夫妻性生活电影 | 国产精品综合久久久久久 | 欧洲亚洲激情 | av一区在线 | 久久精品—区二区三区 | 91精品久久久久久综合乱菊 | 日日婷婷夜日日天干 | 欧美日韩在线播放 | 国产精品女主播一区二区三区 | 99精品国产高清在线观看 | 色综合久久久久综合体桃花网 | 国产精品久久网 | 婷婷丁香六月天 | 天天操天操 | 夜色资源站国产www在线视频 | 黄色官网在线观看 | 国产精品入口麻豆 | 亚洲日本一区二区在线 | 日韩精品免费在线观看 | 亚洲欧美一区二区三区孕妇写真 |