日韩精品一区二区三区在线视频放-无码中文字幕V?一区二区-成年片免费观看视频-国内少妇人妻丰满av-国产精品中文字幕免费观看-亚洲成人久久一区二区三区-国内少妇偷人精品视频无缓冲-一区二区国产精品日本一区二区三区在线网

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

Redis深度實(shí)戰(zhàn):從數(shù)據(jù)結(jié)構(gòu)到高可用架構(gòu)與緩存治理

Redis深度實(shí)戰(zhàn):從數(shù)據(jù)結(jié)構(gòu)到高可用架構(gòu)與緩存治理 說個(gè)實(shí)話Redis 是被低估得最厲害的一個(gè)中間件。很多人學(xué)了幾天會(huì)了SET和GET知道五種數(shù)據(jù)類型就以為自己入門了結(jié)果一到面試被問“緩存穿透怎么解決”“主從切換會(huì)不會(huì)丟數(shù)據(jù)”或者一上線就被慢查詢、內(nèi)存暴漲、分布式鎖失效折騰到懷疑人生才發(fā)現(xiàn)自己根本沒摸到 Redis 的門。這篇筆記不是給你背面試題的是按我實(shí)際折騰 Redis 的路徑整理的從安裝選型、數(shù)據(jù)類型底層邏輯到高可用架構(gòu)、緩存治理、常見故障排查一次講透。內(nèi)容適用于用 Redis 做緩存、做分布式鎖、做排行榜、做消息隊(duì)列的開發(fā)者和運(yùn)維同學(xué)也適合準(zhǔn)備大廠面試、想系統(tǒng)梳理 Redis 知識(shí)體系的人。我盡量用大白話講清楚每個(gè)關(guān)鍵選擇的“為什么”而不是只告訴你“怎么做”。1. 學(xué)習(xí)路線與整體設(shè)計(jì)思路拆解1.1 為什么你該把 Redis 當(dāng)“數(shù)據(jù)結(jié)構(gòu)服務(wù)器”來學(xué)很多教程開場(chǎng)就說“Redis 是高性能 KV 緩存數(shù)據(jù)庫(kù)”這個(gè)定位本身沒錯(cuò)但它直接把你的思路帶窄了。如果只把 Redis 當(dāng)緩存那你永遠(yuǎn)只會(huì)用它來存字符串遇到實(shí)際需求就想“這玩意兒是不是不適合”——排行榜用 ZSet、去重用 Set、消息隊(duì)列用 List 或 Stream、分布式 ID 用 INCR、附近的人用 GEO這些都不是“緩存”而是數(shù)據(jù)結(jié)構(gòu)能力。我建議把 Redis 理解成“一個(gè)跑在內(nèi)存里的數(shù)據(jù)結(jié)構(gòu)服務(wù)器”。它和 MySQL 最大的區(qū)別不是快而是它的數(shù)據(jù)模型本身就是為特定數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的你往里面放 String、Hash、List、Set、ZSet它幫你維護(hù)增刪改查、排序、聚合、去重這些能力。學(xué) Redis 的第一原則就是拿到一個(gè)需求先判斷“這個(gè)數(shù)據(jù)結(jié)構(gòu)適不適合用 Redis 表達(dá)”而不是“能不能塞進(jìn)緩存里”。帶著這個(gè)思路學(xué)習(xí)路徑就清晰了先掌握命令和數(shù)據(jù)結(jié)構(gòu)再理解持久化和過期策略接著上高可用和集群最后回到緩存治理和分布式鎖這些真實(shí)場(chǎng)景。每一步都在解決前一步帶來的新問題是一條完整的鏈路。1.2 按階段拆解基礎(chǔ)、進(jìn)階、實(shí)戰(zhàn)三步走第一階段是基礎(chǔ)目標(biāo)是“會(huì)用”。這個(gè)階段只需要搞定三件事安裝、五種數(shù)據(jù)類型、常用命令。你可以把 Redis 跑起來然后用redis-cli或者可視化工具比如 Another Redis Desktop Manager手動(dòng)敲命令把每種數(shù)據(jù)類型的增刪改查、過期時(shí)間、TTL 都過一遍。這一步不需要背命令大全先把最常用的三十個(gè)命令用到條件反射就行。第二階段是進(jìn)階目標(biāo)是“懂原理”。這個(gè)階段要搞清楚三塊內(nèi)容Redis 為什么快單線程 IO 多路復(fù)用、數(shù)據(jù)怎么不丟RDB 和 AOF、內(nèi)存不夠了怎么辦過期策略和淘汰策略。這三個(gè)問題是面試高頻題也是你以后排查性能問題和設(shè)計(jì)緩存方案的理論基礎(chǔ)。很多人在這個(gè)階段容易犯的錯(cuò)是只背概念不結(jié)合命令去驗(yàn)證。比如你背了“Redis 默認(rèn)有 16 個(gè)庫(kù)”但你不知道SELECT 1切庫(kù)之后AOF 重寫、RDB 快照到底怎么處理多庫(kù)數(shù)據(jù)你背了“LRU 淘汰”但你不知道 Redis 的 LRU 是近似實(shí)現(xiàn)不是嚴(yán)格 LRU。第三階段是實(shí)戰(zhàn)目標(biāo)是“會(huì)排障”。這一階段要圍繞真實(shí)場(chǎng)景展開主從怎么搭、哨兵解決了什么問題、集群的槽位是怎么分配的、緩存穿透擊穿雪崩分別怎么應(yīng)對(duì)、分布式鎖怎么實(shí)現(xiàn)才不會(huì)出事故。這個(gè)階段的標(biāo)志是你開始能看懂redis.log里的告警信息能根據(jù)INFO命令的輸出判斷系統(tǒng)健康度能在 Redis Desktop Manager 的連接失敗提示里快速定位問題。我個(gè)人建議這個(gè)階段配合 Docker 來做實(shí)驗(yàn)因?yàn)橹鲝?、哨兵、集群的搭建?huì)反復(fù)摧毀重建用容器最省心。2. 環(huán)境準(zhǔn)備安裝、選型與可視化工具的坑2.1 Windows 安裝別去官網(wǎng)下“官方 Windows 版”先說一個(gè)很多人踩過的坑Redis 官方是不支持 Windows 的官網(wǎng)只提供 Linux 源碼包。你在網(wǎng)上搜“redis windows 下載”搜到的那些.exe安裝包基本都是第三方移植版或者微軟舊版維護(hù)分支。不是說不能用而是要選對(duì)來源。如果你只是本地學(xué)習(xí)我推薦最常見的方案去 Redis 的 Windows 移植倉(cāng)庫(kù)比如 tporadowski/redis下載 zip 包解壓后直接運(yùn)行redis-server.exe默認(rèn)端口 6379 就能起來redis-cli.exe就是命令行客戶端特別適合新手。注意兩個(gè)細(xì)節(jié)第一這個(gè)移植版大多停留在 Redis 5.x 或 6.x 版本學(xué)習(xí)和單機(jī)測(cè)試沒問題但它和 Linux 官方版在高版本特性上會(huì)有差異生產(chǎn)環(huán)境千萬別用第二啟動(dòng)后進(jìn)程會(huì)一直占著控制臺(tái)窗口關(guān)掉窗口 關(guān)掉服務(wù)學(xué)習(xí)階段無所謂但你最好知道有redis-server --service-install這種以 Windows 服務(wù)方式運(yùn)行的命令。Linux 上安裝是更正經(jīng)的做法。以 CentOS 和 Ubuntu 為例源碼編譯是標(biāo)準(zhǔn)的安裝路徑下載源碼包、make、make install。編譯之前記得裝好gcc和make否則會(huì)報(bào)一堆讓人頭大的編譯錯(cuò)誤。編譯安裝完Redis 的可執(zhí)行文件會(huì)放在/usr/local/bin配置文件在源碼目錄下的redis.conf。這里有個(gè)常見坑很多人直接./redis-server啟動(dòng)結(jié)果發(fā)現(xiàn)根本沒有配置文件生效所有的數(shù)據(jù)持久化和后臺(tái)運(yùn)行配置都失效了。正確姿勢(shì)是./redis-server /path/to/redis.conf顯式指定配置文件。2.2 Docker 方式學(xué)習(xí)高可用架構(gòu)最快的路徑如果你要學(xué)主從、哨兵、集群我強(qiáng)烈建議直接用 Docker。手寫配置文件、在一臺(tái)機(jī)器上起多個(gè)實(shí)例不是不行但改端口、改 pid 文件、調(diào)日志路徑會(huì)消耗大量耐心。用 Docker 的話一條docker run命令就是一個(gè)獨(dú)立實(shí)例網(wǎng)絡(luò)隔離也是天然的。舉個(gè)例子搭建一主兩從的 Redis 主從結(jié)構(gòu)# 創(chuàng)建自定義網(wǎng)絡(luò)方便容器間通過容器名互相訪問 docker network create redis-net # 主節(jié)點(diǎn) docker run -d --name redis-master --network redis-net -p 6379:6379 redis:7.0 redis-server --appendonly yes # 從節(jié)點(diǎn)1 docker run -d --name redis-slave1 --network redis-net -p 6380:6379 redis:7.0 redis-server --appendonly yes --slaveof redis-master 6379 # 從節(jié)點(diǎn)2 docker run -d --name redis-slave2 --network redis-net -p 6381:6379 redis:7.0 redis-server --appendonly yes --slaveof redis-master 6379啟動(dòng)完成后進(jìn)入主節(jié)點(diǎn)容器執(zhí)行INFO replication你就能看到兩個(gè)從節(jié)點(diǎn)已經(jīng)連接上來。用 Docker 做這種實(shí)驗(yàn)的好處是環(huán)境干凈、銷毀容易、模擬故障特別方便。比如你直接docker stop redis-slave1就能觀察主從斷開后主節(jié)點(diǎn)有沒有報(bào)錯(cuò)、從節(jié)點(diǎn)重連后的數(shù)據(jù)同步情況。注意Docker 方式雖然方便但你要分清兩個(gè)概念——--slaveof這是主從復(fù)制的配置不是集群的配置。主從復(fù)制解決的是“數(shù)據(jù)多副本冗余”集群解決的是“數(shù)據(jù)分片存儲(chǔ)”。很多人把這兩個(gè)搞混后面看集群文檔時(shí)一臉懵。2.3 可視化客戶端Redis Desktop Manager 的替代品Redis Desktop Manager簡(jiǎn)稱 RDM是搜索最多、知名度最高的 Redis 可視化客戶端但它的坑也不少。2022 年起新版 RDM 開始收費(fèi)如果你搜“redis desktop manager 免費(fèi)版”或者“redis desktop manager 開源舊版”能找到的是最后一個(gè)免費(fèi)開源版本大概停在 2022 年 6 月左右。當(dāng)年很多人就在這個(gè)坎上栽了跟頭——下載安裝了新版一打開就彈試用提醒還看不到 key 列表的完整功能。我實(shí)際用下來的推薦是如果只是日常學(xué)習(xí)直接用Another Redis Desktop Manager這是一個(gè)完全開源免費(fèi)、持續(xù)維護(hù)的替代品。它的 UI 比舊版 RDM 更現(xiàn)代支持 SSH 隧道、支持可視化查看 stream、支持命令執(zhí)行的實(shí)時(shí)監(jiān)控對(duì)單機(jī)、集群、哨兵模式都有不錯(cuò)的支持。當(dāng)然如果你只有幾臺(tái)服務(wù)器、鍵也不多用命令行的redis-cli其實(shí)完全夠可視化客戶端的核心價(jià)值是讓你看清 key 的分布、內(nèi)存占用和過期時(shí)間排查問題時(shí)特別直觀。3. 五大數(shù)據(jù)類型與底層實(shí)現(xiàn)邏輯3.1 String不只是字符串的三層編碼String 是一個(gè)繞不開的基礎(chǔ)但你真不一定了解它。Redis 的 String 除了存文本還能存數(shù)字配合 INCR/DECR 做計(jì)數(shù)器、存二進(jìn)制數(shù)據(jù)比如圖片的字節(jié)流但容易讓你翻車的點(diǎn)在于它的內(nèi)存編碼。Redis 對(duì) String 做了三種內(nèi)部編碼int純數(shù)字、embstr短字符串、raw長(zhǎng)字符串。前兩種字節(jié)數(shù)少存儲(chǔ)緊湊超過 44 字節(jié)會(huì)自動(dòng)轉(zhuǎn)成raw。這個(gè) 44 字節(jié)不是隨便定的它和 Redis 內(nèi)部redisObject結(jié)構(gòu)的對(duì)齊、內(nèi)存分配器的分配粒度有關(guān)你不需要死記但你得理解Redis 對(duì)短字符串做了極致優(yōu)化所以設(shè)計(jì) key 時(shí)別弄?jiǎng)虞m幾百字節(jié)的 value除非業(yè)務(wù)必須。實(shí)際測(cè)試下來一個(gè)幾百字節(jié)的 value 比短字符串多占 3~5 倍內(nèi)存這在千萬級(jí) key 的緩存里就是幾十 GB 的差距。String 最常見的生產(chǎn)場(chǎng)景有三個(gè)緩存、計(jì)數(shù)器、分布式 ID。計(jì)數(shù)器用INCR時(shí)要留心INCR不準(zhǔn)的坑——這里說的“不準(zhǔn)”不是 Redis 算錯(cuò)而是并發(fā)下的計(jì)數(shù)語義問題。如果你用INCR做庫(kù)存扣減命令本身是原子的沒問題但如果你先GET再SET這就是經(jīng)典的讀改寫競(jìng)態(tài)丟更新就是必然結(jié)果。類似“瀏覽量 1”這種業(yè)務(wù)用INCR沒問題但“基于當(dāng)前值做復(fù)雜計(jì)算再寫回”就必須用 Lua 腳本或者加鎖。3.2 Hash對(duì)象類數(shù)據(jù)的“常規(guī)武器”和 Redis 的“乞丐版分片”Hash 在業(yè)務(wù)里最典型的應(yīng)用是存儲(chǔ)對(duì)象。比如一個(gè)用戶信息最笨的存法是SET user:1001 {name:tom,age:18}問題是改一個(gè)字段就要整體覆蓋整個(gè) JSON浪費(fèi)網(wǎng)絡(luò)和內(nèi)存。用 Hash 存就變成了HSET user:1001 name tom age 18改哪個(gè)字段就只更新哪個(gè)字段還能單獨(dú)對(duì)字段設(shè)置過期時(shí)間嗎不行Hash 本身沒有字段級(jí)別的 TTL這是它和 String 的另一個(gè)取舍。Hash 內(nèi)部編碼有兩種ziplist和hashtable。當(dāng)字段數(shù)量少、字段值小的時(shí)候用ziplist緊湊存儲(chǔ)字段多了或者值大了自動(dòng)轉(zhuǎn)成hashtable。這里有一個(gè)用 Hash 做“小分片”的思路當(dāng)單個(gè) key 的 value 過大比如一個(gè)大 List 存了百萬條記錄會(huì)導(dǎo)致讀寫這個(gè) key 的耗時(shí)增加這在 Redis 里叫“大 key 問題”。解決方案之一就是把一個(gè)大集合拆成多個(gè)小 Hash。舉例來說如果你要存一個(gè)用戶的行為記錄一天幾十條不要用SET user_actions:1001 大JSON而是按天分片HINCRBY user_actions:20250120:1001 type_click 1這樣每個(gè) key 只負(fù)責(zé)一天的增量數(shù)據(jù)。這個(gè)思路在任何需要給單個(gè) key 瘦身的場(chǎng)景都通用理解它能幫你解決一大批“Redis 查詢?cè)絹碓铰钡膯栴}。3.3 List 和 Stream隊(duì)列功能到底用誰List 的LPUSHRPOP組合是最簡(jiǎn)單的生產(chǎn)者消費(fèi)者模式配合BLPOP還能實(shí)現(xiàn)阻塞讀很多輕量級(jí)消息隊(duì)列就是用這個(gè)做的。但 List 做隊(duì)列有天然的毛病消息丟失沒有重試機(jī)制沒有消費(fèi)確認(rèn)消費(fèi)者崩了就永遠(yuǎn)丟了而且LRANGE翻頁取數(shù)據(jù)雖然方便但對(duì)長(zhǎng)列表是 O(N) 操作列表一長(zhǎng)就拖垮性能。所以 Redis 5.0 之后引入了 Stream它的設(shè)計(jì)目標(biāo)就是正兒八經(jīng)的消息隊(duì)列支持消費(fèi)者組、支持消息確認(rèn)ACK、支持 PEL待處理列表、支持持久化。如果你在做項(xiàng)目時(shí)需要一個(gè)“能用但不想引入 Kafka/RabbitMQ”的輕量隊(duì)列Stream 幾乎是唯一正解。我自己的建議是隊(duì)列非常簡(jiǎn)單的場(chǎng)景比如事件通知丟了也無所謂可以用 List要求消息不丟、要消費(fèi)組、要重試用 Stream。面試問到“Redis 做消息隊(duì)列”你要能說出這個(gè)演進(jìn)關(guān)系比單純背命令值錢多了。3.4 Set 和 ZSet從去重到排行榜Set 用來做去重和集合運(yùn)算交集、并集、差集典型場(chǎng)景是抽獎(jiǎng)、標(biāo)簽系統(tǒng)、共同好友。ZSet 比 Set 多了分值排序底層是跳躍表 哈希表跳躍表的時(shí)間復(fù)雜度是 O(log N)所以 ZSet 在百萬級(jí)數(shù)據(jù)量下的排序操作依然很快。排行榜、實(shí)時(shí)熱點(diǎn)、延時(shí)隊(duì)列都是 ZSet 的主場(chǎng)。我要提醒一個(gè) ZSet 的坑同樣是ZADD如果你在寫入時(shí)不控制 member 的規(guī)模一個(gè) ZSet 里有幾百萬個(gè) member后續(xù)的ZRANGE、ZREM雖然單次很快但內(nèi)存占用會(huì)非常嚇人。ZSet 的成員越多跳躍表的指針開銷越大單個(gè) member 的額外開銷可能有幾十字節(jié)。所以設(shè)計(jì)上要注意排行榜類數(shù)據(jù)要么只保留 Top N用ZREMRANGEBYRANK定期清理要么按業(yè)務(wù)維度拆 key比如按天拆排行榜千萬別讓一個(gè) ZSet 無限增長(zhǎng)。4. 高可用架構(gòu)主從、哨兵與集群4.1 主從復(fù)制REPLICAOF 背后的增量與全量同步主從復(fù)制解決的是“單點(diǎn)故障”問題。主節(jié)點(diǎn)可讀可寫從節(jié)點(diǎn)默認(rèn)只讀主節(jié)點(diǎn)把寫操作同步給從節(jié)點(diǎn)。同步分兩種情況全量同步和增量同步。全量同步發(fā)生在從節(jié)點(diǎn)剛連接主節(jié)點(diǎn)、或者主從數(shù)據(jù)差距過大時(shí)。流程是從節(jié)點(diǎn)發(fā)送PSYNC命令主節(jié)點(diǎn)執(zhí)行BGSAVE生成 RDB 快照發(fā)給從節(jié)點(diǎn)從節(jié)點(diǎn)清空舊數(shù)據(jù)并加載快照然后主節(jié)點(diǎn)把快照生成期間新增的寫命令存在復(fù)制緩沖區(qū)里再發(fā)給從節(jié)點(diǎn)。增量同步靠的是主從之間維護(hù)的復(fù)制偏移量如果偏移量還在緩沖區(qū)范圍內(nèi)只需要同步差額部分如果從節(jié)點(diǎn)斷連太久緩沖區(qū)里的數(shù)據(jù)已經(jīng)覆蓋了就得重新全量同步。這里有一個(gè)隱藏很深的坑如果從節(jié)點(diǎn)斷連時(shí)間很短但主節(jié)點(diǎn)的復(fù)制緩沖區(qū)太小默認(rèn) 1MB可通過client-output-buffer-limit replica調(diào)大也會(huì)觸發(fā)全量同步。全量同步一旦頻繁發(fā)生主節(jié)點(diǎn)要反復(fù) BGSAVE 傳輸數(shù)據(jù)CPU 和網(wǎng)絡(luò)都會(huì)被打滿導(dǎo)致主節(jié)點(diǎn)阻塞。生產(chǎn)環(huán)境出現(xiàn)“主從反復(fù)全量同步”的情況第一件事就是去看INFO replication里的偏移量差值和緩沖區(qū)大小。4.2 哨兵自動(dòng)故障轉(zhuǎn)移的“哨兵進(jìn)程”主從復(fù)制解決了數(shù)據(jù)冗余但主節(jié)點(diǎn)掛了從節(jié)點(diǎn)不會(huì)自動(dòng)頂上需要人工切換。哨兵Sentinel就是來解決這個(gè)問題的它是一個(gè)獨(dú)立進(jìn)程負(fù)責(zé)監(jiān)控主從節(jié)點(diǎn)的健康狀態(tài)在主節(jié)點(diǎn)掛掉后自動(dòng)從從節(jié)點(diǎn)中選舉出一個(gè)新主節(jié)點(diǎn)并把其他從節(jié)點(diǎn)重新指向新主節(jié)點(diǎn)。但哨兵不是萬能的。它最被人質(zhì)疑的點(diǎn)是哨兵本身就是單點(diǎn)雖然可以部署哨兵集群而且故障轉(zhuǎn)移期間存在“腦裂”窗口。經(jīng)典場(chǎng)景主節(jié)點(diǎn)和哨兵之間的網(wǎng)絡(luò)發(fā)生分區(qū)哨兵認(rèn)為主節(jié)點(diǎn)掛了選舉出新的主節(jié)點(diǎn)但原主節(jié)點(diǎn)其實(shí)還活著還能接收寫入等網(wǎng)絡(luò)恢復(fù)后原主節(jié)點(diǎn)的數(shù)據(jù)就和新主節(jié)點(diǎn)不一致了這部分丟失的數(shù)據(jù)無法找回。所以涉及錢的業(yè)務(wù)比如扣庫(kù)存、交易流水不能只靠 Redis 主從 哨兵保證強(qiáng)一致這是架構(gòu)層面的問題。用 Docker 搭建哨兵的時(shí)候最容易被坑的是配置文件里的sentinel monitor master-name host port quorum這個(gè)host不能寫127.0.0.1因?yàn)樯诒枰ㄖ捌渌鄙诒汀捌渌睆墓?jié)點(diǎn)連接主節(jié)點(diǎn)。在容器環(huán)境里主機(jī)地址要寫容器網(wǎng)絡(luò)中可達(dá)的別名的地址比如redis-master。這個(gè)細(xì)節(jié)我當(dāng)年調(diào)試了一下午白屏的時(shí)間都浪費(fèi)在地址可達(dá)性上。4.3 集群數(shù)據(jù)分片的槽位分配以及為什么集群也有“一票否決”Redis Cluster 和主從哨兵是兩套不同的體系。Cluster 把整個(gè)數(shù)據(jù)空間分成 16384 個(gè)槽位每個(gè)節(jié)點(diǎn)負(fù)責(zé)一部分槽位key 通過CRC16(key) % 16384計(jì)算屬于哪個(gè)槽。寫請(qǐng)求如果落到了非負(fù)責(zé)節(jié)點(diǎn)節(jié)點(diǎn)會(huì)返回MOVED錯(cuò)誤客戶端要跟著重定向。這是 Cluster 和單機(jī)模式最大的體驗(yàn)差異——你的客戶端必須支持集群協(xié)議比如 Jedis 的JedisCluster、Lettuce 的集群模式否則會(huì)出現(xiàn)各種莫名其妙的連接和寫入失敗。Cluster 本身自帶主從冗余每個(gè)主節(jié)點(diǎn)可以掛一個(gè)或多個(gè)從節(jié)點(diǎn)主掛了從自動(dòng)頂上。但要注意Cluster 的可用性判定比哨兵更嚴(yán)格如果一個(gè)主節(jié)點(diǎn)和它的所有從節(jié)點(diǎn)同時(shí)掛掉整個(gè)集群就會(huì)進(jìn)入不可用狀態(tài)即使其他槽位的主節(jié)點(diǎn)都活著。這就是少數(shù)派不可訪問導(dǎo)致集群不可用的經(jīng)典場(chǎng)景。查詢操作可以通過CLUSTER SLOTS命令看清楚每個(gè)槽位的負(fù)責(zé)節(jié)點(diǎn)這個(gè)命令排障時(shí)非常好使。Docker 部署集群有幾個(gè)注意點(diǎn)端口映射不能只映射 6379因?yàn)榧和ㄐ乓?16379總線端口不映射會(huì)造成節(jié)點(diǎn)間通信失敗容器重啟后 IP 變化會(huì)讓集群變的不可用解決辦法是給容器設(shè)置固定 IP--ip或使用 Docker Swarm / Kubernetes 的穩(wěn)定 DNS 名稱。這些問題在本地實(shí)驗(yàn)時(shí)不明顯但如果你用 KubeSphere 之類的平臺(tái)去搭建 Redis 集群就會(huì)頻繁遇到“集群狀態(tài)正常但客戶端連不上”的怪事排查到最后基本都是網(wǎng)絡(luò)標(biāo)識(shí)變動(dòng)引起的。4.4 從“會(huì)搭”到“會(huì)調(diào)”配置參數(shù)背后的取舍搭建完高可用架構(gòu)你才能真正讀懂配置文件里的各種參數(shù)。比如maxmemory和maxmemory-policy決定了內(nèi)存耗盡后的行為——allkeys-lru是全局近似 LRU 淘汰volatile-ttl只對(duì)設(shè)置了過期時(shí)間的 key 淘汰。再比如appendonly yes開啟 AOF 后appendfsync everysec表示每秒刷盤一次這是性能和可靠性的折中方案always最安全但性能下降明顯no交給操作系統(tǒng)決定但可能丟失一秒鐘的數(shù)據(jù)。關(guān)于 AOF 和 RDB我的建議是生產(chǎn)環(huán)境兩者都開RDB 做快速恢復(fù)的冷備AOF 做災(zāi)備的精確日志。只開 AOF 的坑是AOF 文件會(huì)越來越大雖然 rewrite 能瘦身但如果宕機(jī)時(shí) AOF 文件有損壞Redis 可能啟動(dòng)失敗需要先運(yùn)行redis-check-aof --fix修復(fù)。只開 RDB 的坑更明顯兩次快照之間的數(shù)據(jù)全部丟失。我遇到過把 RDB 快照間隔設(shè)成 900 秒的項(xiàng)目一次斷電丟了十五分鐘緩存雖然后臺(tái)有 MySQL 兜底但那個(gè)時(shí)間段的請(qǐng)求壓力直接把 DB 打崩了這個(gè)教訓(xùn)說明持久化參數(shù)不是隨便填的。5. 緩存治理穿透、擊穿、雪崩與分布式鎖5.1 緩存三大災(zāi)難的應(yīng)對(duì)不是靠 Redis 本身緩存穿透、擊穿、雪崩這三個(gè)問題面試必問但很多人回答得過于套路化。我按自己的經(jīng)驗(yàn)說說區(qū)別和處理優(yōu)先級(jí)。緩存穿透是查一個(gè)根本不存在的數(shù)據(jù)緩存里沒有數(shù)據(jù)庫(kù)里也沒有請(qǐng)求直接打到 DB。對(duì) Redis 而言它根本沒壓力壞的是 DB。常見的解法有三種緩存空值設(shè)置一個(gè)較短的過期時(shí)間比如 5 分鐘、布隆過濾器一種空間效率很高的概率型數(shù)據(jù)結(jié)構(gòu)不存在則直接短路、參數(shù)校驗(yàn)攔截非法請(qǐng)求。我個(gè)人覺得業(yè)務(wù)層參數(shù)校驗(yàn)是最先該做的布隆過濾器適合 key 基數(shù)大的場(chǎng)景空值緩存適合 key 容易被窮舉暴力的場(chǎng)景。緩存擊穿是某一個(gè)熱點(diǎn) key 過期瞬間大量請(qǐng)求直接打到 DB。注意是“單個(gè) key”不是“一批 key”。應(yīng)對(duì)的核心思路是“不讓 DB 扛流量”一是互斥鎖只有一個(gè)線程去查 DB 重建緩存其它線程等待或返回默認(rèn)值二是邏輯過期不讓 key 實(shí)際過期而是在 value 里塞一個(gè)過期時(shí)間戳后臺(tái)異步刷新適合對(duì)一致性要求不高的熱點(diǎn)數(shù)據(jù)。緩存雪崩是大量 key 同時(shí)過期或者 Redis 實(shí)例宕機(jī)導(dǎo)致流量直撲 DB。處理手法過期時(shí)間加隨機(jī)值比如SETEX key (base random(0,300))、熱點(diǎn) key 預(yù)熱、多級(jí)緩存兜底本地 Caffeine 再擋一層。在 Redis 本身宕機(jī)時(shí)多級(jí)緩存幾乎是唯一能在 Redis 恢復(fù)前保護(hù) DB 的手段否則你再怎么設(shè)計(jì)過期時(shí)間也擋不住洪水。5.2 分布式鎖SET NX EX 和 Lua 缺一不可說到分布式鎖最常見的實(shí)現(xiàn)是基于SET key value NX EX seconds。注意這個(gè)命令必須是一條命令完成不能拆成SETNX再EXPIRE因?yàn)閮蓷l命令之間有間隙進(jìn)程崩了鎖就沒過期時(shí)間了死鎖就是這么來的。然后是釋放鎖很多人寫成if (redis.call(GET, KEYS[1]) ARGV[1]) then return redis.call(DEL, KEYS[1]) else return 0 end為什么要用 Lua因?yàn)椤芭袛嘀凳欠袷亲约旱摹焙汀皠h除 key”是兩個(gè)操作拆開執(zhí)行中間鎖過期了別的線程拿到了鎖然后你把這個(gè)別人的鎖刪了。這個(gè) bug 在并發(fā)稍高的場(chǎng)景下必現(xiàn)。用 Lua 把兩步合并成一個(gè)原子操作這是分布式鎖最底層的底線。還有兩個(gè)進(jìn)階問題要心里有數(shù)。第一個(gè)是“鎖過期時(shí)間怎么設(shè)”業(yè)務(wù)執(zhí)行時(shí)間可能超過鎖的過期時(shí)間導(dǎo)致鎖被提前釋放解決辦法是“看門狗”機(jī)制——在持有鎖期間定期續(xù)期但這是 Redisson 這些客戶端庫(kù)實(shí)現(xiàn)的能力自己裸寫要慎重。第二個(gè)是“主從切換鎖丟失”的問題主節(jié)點(diǎn)拿到了鎖但數(shù)據(jù)還沒同步到從節(jié)點(diǎn)主節(jié)點(diǎn)掛了從節(jié)點(diǎn)頂上后鎖就沒了。Redisson 的 RedLock 試圖解決這個(gè)問題但代價(jià)是復(fù)雜度陡增而且在大規(guī)模部署下正確性爭(zhēng)議一直存在。我的建議是能用數(shù)據(jù)庫(kù)唯一約束解決的業(yè)務(wù)就別用 Redis 分布式鎖用了就要接受它的“在極端故障下有鎖丟失風(fēng)險(xiǎn)”這個(gè)前提。5.3 序列化Redis 客戶端里最容易被忽視的性能瓶頸Java 用 Redis 時(shí)序列化方式直接影響你能存什么、占多少內(nèi)存。最常用的兩個(gè)StringRedisTemplate是純字符串讀寫存 Java 對(duì)象時(shí)你得自己把對(duì)象轉(zhuǎn)成 JSONRedisTemplateGenericJackson2JsonRedisSerializer可以自動(dòng)把對(duì)象序列化成 JSON 存入取出來時(shí)反序列化回對(duì)象非常方便但代價(jià)是存儲(chǔ)的內(nèi)容里會(huì)帶一段class類型信息占用并不大但是讀出來的數(shù)據(jù)肉眼看起來也不是那么干凈。序列化還有一個(gè)隱藏痛點(diǎn)默認(rèn)的JdkSerializationRedisSerializerSpring Data Redis 默認(rèn)配置如果沒做任何定制是 Java 原生序列化二進(jìn)制格式占用空間大而且存進(jìn)去的東西你在可視化工具里完全看不懂全是\xAC\xED開頭的一堆亂碼。我強(qiáng)烈建議任何項(xiàng)目都顯式配置 JSON 序列化方式除非你能忍受排查問題時(shí)對(duì)著亂碼猜內(nèi)容。Python 連接 Redis 也有類似問題用pickle序列化存進(jìn)去的數(shù)據(jù)別指望redis-cli能人類可讀。跨語言讀寫同一個(gè) key 時(shí)一定要統(tǒng)一序列化方案否則等著你的就是亂碼或者反序列化異常。5.4 Lua 腳本不是炫技是原子性的救命稻草Redis 的 Lua 腳本能力很多初學(xué)者不重視覺得“我是業(yè)務(wù)開發(fā)用不上 Lua”。但實(shí)際上只要你的操作需要“讀當(dāng)前值 - 計(jì)算 - 寫回”這樣的組合Lua 就是最優(yōu)雅的原子性保證。前面說的分布式鎖釋放邏輯只是一個(gè)例子還有“限流器”INCR后判斷當(dāng)前計(jì)數(shù)是否超限超過則返回失敗整個(gè)過程塞進(jìn) Lua 里執(zhí)行就沒有并發(fā)下超發(fā)的問題。Lua 在 Spring 中通常用DefaultRedisScript配合execute調(diào)用在 Python 里是redis.register_script。用 Lua 時(shí)有幾個(gè)細(xì)節(jié)容易踩坑第一Lua 腳本里要訪問 Redis key 必須通過KEYS[]數(shù)組傳入不能寫在腳本里拼字符串否則 Redis 無法預(yù)分配槽位第二腳本執(zhí)行期間會(huì)阻塞 Redis千萬別寫死循環(huán)或者毫秒級(jí)都算慢的重計(jì)算第三腳本的“確定性”要求它不能在執(zhí)行過程中讀取自身的寫入結(jié)果在集群模式下會(huì)直接報(bào)錯(cuò)所以你在集群環(huán)境用 Lua 時(shí)要特別克制盡量只對(duì)單個(gè) key 做操作。6. 從學(xué)習(xí)到面試高頻題、監(jiān)控日志和排障手冊(cè)6.1 高頻面試題我建議你追根溯源別只背答案翻一翻網(wǎng)上流傳的“Redis 面試題”問得最多的是這些Redis 為什么快、緩存穿透和擊穿怎么解決、分布式鎖怎么實(shí)現(xiàn)、持久化怎么選、主從和集群的腦裂問題。這些問題并不難難的是你說答案的時(shí)候有沒有“現(xiàn)場(chǎng)感”。比如“Redis 為什么快”標(biāo)準(zhǔn)答案是“單線程避免上下文切換 基于 IO 多路復(fù)用的事件循環(huán) 純內(nèi)存操作”但你要是再往深走一步“單線程為什么還能這么快IO 多路復(fù)用到底是什么”很多人的回答就開始含糊了。我自己的理解是Redis 把每個(gè)連接封裝成一個(gè)文件事件交給內(nèi)核去監(jiān)聽讀寫事件有事件到達(dá)才觸發(fā)回調(diào)處理這本質(zhì)上和 Nginx 的事件驅(qū)動(dòng)模型類似是把“等待 IO”這件事從線程里解放出去了。你用“餐廳只有一個(gè)服務(wù)員但門口的鈴一響服務(wù)員才出去接待而不是坐在門口死等每個(gè)客人”這個(gè)類比就可以跟小白講清楚。再比如“Kubernetes 上能不能搭 Redis”這其實(shí)是一個(gè)信號(hào)題對(duì)方想看你有沒有意識(shí)到在云原生場(chǎng)景下Redis 這類有狀態(tài)應(yīng)用對(duì)網(wǎng)絡(luò)標(biāo)識(shí)Pod IP、節(jié)點(diǎn)名的依賴很強(qiáng)StatefulSet 是唯一合理的選擇。如果你能說出 StatefulSet 的穩(wěn)定網(wǎng)絡(luò)標(biāo)識(shí)和 Redis Cluster 的槽位分配之間是什么關(guān)系面試官對(duì)你的印象會(huì)立刻不一樣。6.2 日志、監(jiān)控和常見錯(cuò)誤每一個(gè)報(bào)錯(cuò)都別放過排查 Redis 問題的第一步是看日志。Docker 部署的實(shí)例用docker logs 容器名Linux 直接看日志文件的路徑在 redis.conf 里的logfile配置項(xiàng)。我最常關(guān)注的日志信息有幾類Background saving terminated by signal表示 BGSAVE 失敗通常和內(nèi)存或文件系統(tǒng)有關(guān)Possible nokey和Cant persist這類表示 RDB/AOF 寫入出問題要優(yōu)先檢查磁盤空間df -hMISCONF Redis is configured to save RDB snapshots, but its currently unable to persist on disk這個(gè)經(jīng)典的只讀錯(cuò)誤就是磁盤寫不進(jìn)去導(dǎo)致的。監(jiān)控指標(biāo)要盯四個(gè)connected_clients連接數(shù)used_memory內(nèi)存占用keyspace_hits和keyspace_misses算命中率命中率長(zhǎng)期低于 80% 說明緩存設(shè)計(jì)有問題rdb_last_bgsave_status和aof_last_write_status持久化狀態(tài)。用redis-cli INFO stats | grep keyspace可以快速查命中率用SLOWLOG GET可以看慢查詢結(jié)合實(shí)際業(yè)務(wù)分析是查還是不查??梢暬ぞ哌B接不上的排查路徑也很有套路基本按這個(gè)順序來第一步ping通不通第二步 telnet 6379 通不通第三步看服務(wù)端有沒有設(shè)置bind 127.0.0.1很多默認(rèn)配置只監(jiān)聽本機(jī)外部當(dāng)然連不上第四步看有沒有requirepass認(rèn)證第五步看云廠商安全組/防火墻有沒有放行 6379。八成問題都出在bind和防火墻這兩項(xiàng)。6.3 壓測(cè)、優(yōu)化和一把“性能底牌”最后聊聊性能Redis 本身吞吐很高但別忽略“客戶端導(dǎo)致的問題”。在項(xiàng)目中用了KEYS *這種 O(N) 命令在阻塞事件循環(huán)的同時(shí)它可能讓整個(gè) Redis 卡頓到毫秒級(jí)超時(shí)。用SMEMBERS拉取一個(gè)巨大 Set 的全部成員它會(huì)撐爆網(wǎng)絡(luò)和內(nèi)存。這些替換方案都是現(xiàn)成的SCAN分批遍歷 keySSCAN遍歷 SetLRANGE注意限制數(shù)量。養(yǎng)成“避免 O(N) 命令”的習(xí)慣是所有 Redis 使用者必須過的一道坎。壓測(cè)工具的選擇上redis-benchmark是官方自帶的最簡(jiǎn)方案但它模擬不了復(fù)雜業(yè)務(wù)流量真要壓真實(shí)場(chǎng)景用redis-cli --latency看延遲分布、用INFO commandstats看每條命令的執(zhí)行次數(shù)和耗時(shí)占比比盲目壓 QPS 更有參考價(jià)值。我見過很多團(tuán)隊(duì)“壓測(cè) QPS 達(dá)標(biāo)”但線上一緊張就告警觀察下來基本都是沒看延遲分布、沒看命令耗時(shí)導(dǎo)致的性能優(yōu)化要看“哪個(gè)命令最慢”而不是“系統(tǒng)最高支持多少 QPS”。我個(gè)人在實(shí)際操作中的體會(huì)是Redis 不是一個(gè)“學(xué)完就完了”的東西它和業(yè)務(wù)形態(tài)綁定得很深。同一個(gè)命令在緩存場(chǎng)景、計(jì)數(shù)場(chǎng)景、隊(duì)列場(chǎng)景中的語義和坑完全不一樣。你學(xué)它的方式?jīng)Q定了你后來踩坑的多少——如果只是背命令你會(huì)覺得它很簡(jiǎn)單如果你動(dòng)手搭過集群、看過日志、壓過延遲、親手修過緩存穿透你才會(huì)真的理解“高性能中間件”這幾個(gè)字背后藏著多少容易被忽略的工程細(xì)節(jié)。這篇筆記是我自己踩坑過程的復(fù)盤寫出來算是給后來者省點(diǎn)時(shí)間尤其是那些第一次在項(xiàng)目里引入 Redis 的朋友愿你少走幾步彎路。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
97操在线| 中文字幕欧美精品亚洲日韩蜜臀| 国产精品在线一区二区| 欧美综合另类| 91AV天美在线视频| 啪啪啪东京| 精品久久青青草| 日本一区二区亚洲综合| 五月丁香| 亚州黄站| 亚洲乱熟女一区二区三区大香蕉| 青青草日韩无码| 另类老少妇| 日逼国产| 久久人妻一区二区三区高清| 欧美性爱三区二区| 黄站在线免费观看| 激情抓乳插进去啪啪啪日韩 | 超碰欧美在线欧美| 99这里只有精品国产| www.婷婷五月天| 久肏视频字幕| 欧美亚洲性爱一区二区| 精品国产av一区二区三区四区入口| 国模不卡| 夜夜操夜夜高潮夜夜爽国产精品区| 欧美综合亚洲综合| 天堂蜜桃无码视频一区二区| 人妻少妇久久| 国模精品娜娜一二三区| 亚洲精品一二三四区| 看看日B真人视频| 91国产在线精品| 国产精品天干天干综合网麻豆| 欧美 亚洲 制服 精品| 亚洲加勒比久久日本道| 午夜福利在线合集| 国产精品成人蜜臀AV在线| 久草草一二三四区久久| 国产福利小视频高清在线观看| 亚洲国产一区二区三区四区国产| 99999无码| 九久久精| 在线综合 亚洲 欧美中文字幕| 欧美爱国产综合、| 蜜臀av在线播放一区二区三区| 五月开心久久AV官网| 国产欧美日韩一区二区三区| 久久草视频污视频| 日韩成人免费电影| 又粗又长又大国产不卡| 成人久久精品| 国产大学生高潮在线播放| 情色图区| 亚洲熟妇丝袜在线观看| 美女极品一区二区三区| 欧美91网| 99热精品国产| 亚洲最大的综合性av| 91精品91久久久久77777| 97色在线| 久久精品人人做人人看| 国产精品在线一区二区| 欧美亚洲高清晰| 欧美午夜视频| 无码色| 欧美东京热青青草| 内射夫妻三片| 在线情色电影 91大| 99日韩| 97精品在线视频| 国产夜夜艹| 伊人女女资源在线观看| 97超碰伊人| 91精品国产综合久久久蜜臀| 免费一级黄色录像影片| 丰满人妻一区二区三区免费| 欧美91丝袜| 中日高清无码操逼视频| 强奸乱伦AV一天堂网| 97视频新免费| 青娱乐蜜桃臀AV色婷| 日本黄 R色 成 人网站| 操逼片中文| 深爱激情五月天| 四虎精品永久在线播放| 91激情国产| 日韩性爱再线视频| 国产一区在线看| 亚洲大色堂| 欧美亚洲中文字幕| 亚洲春色欧美激情自拍| 亚欧成人一级片在线播放| 99热精品国产| 91黑丝美女| 啊啊啊啊嗯嗯嗯用力好爽| 十八禁av无码免费网站APP| 欧美色老汉| 97色涩| 亚洲性天堂| 9999亚洲精品| 日本精品免费一区二区三区四区| 岛国激情视频在线观看| 欧综合网| 91网站18在线| 日日干日日操五月天伦理视频| 欧美性爱18观看| 骚日日av| 学生妹天天看| 日本天天人人狠狠在线日美女 | 91欧洲国产成人久久精品网站| 精品一区96| 自拍偷拍 日韩无码| 国产精品久久久久无码Av网曝门| 偷拍2020| 亚洲综合九| 玖玖爱综合| 99成人| 99久视频| 九九九九久久久| 午夜啪| 久久精品店| 亚洲素人综合| 麻豆天美制片厂网站视频| 天天日日夜夜| 伦理片秋霞免费影院| 国产一区在线观看无码AV| 国产成久久综合片| 国产精品一区二区手机看片| 激情文学小说一区二区 | 国产精品一区二区亚洲人成毛片| 抽插一区二区视频| 91痴汉| 青青草一区二区三区四| 美女诱惑在线一区| 欧美色图 人妻| 国产精品久久久亚洲一区| 国产自产自拍| 淫荡熟女乱伦网| 久久人妻少妇| 一区二区三区四区在线不卡| 久久久久久免费电影| 欧美丝袜美女电影一二三四区| 青青草密桃在线播放| 婷婷在线播放| 国产不卡精品91| 爆乳免费黄网站| 一区二区三区四区五区高清无码永久视频| 欧洲一级性爱视频在线观看| 97福利视频| 欧美第一页性| 欧美综合在线91| 日韩 欧美 国产 麻豆| 91精品免费| 国产91精品福利在线| 日韩无码AB| 97人人夜夜精品视频| 乱子伦一区二区三区国产精品| 日本1区2区不卡视频| 清纯唯美激情四射| 成人 日本A片无码8888| 午夜国产成人精品视频| 亚洲色图欧美色图另类图片| 综合自拍| 丰满人妻一区二区中文| 国产suv精品一区二区四| www.色操逼| 亚洲97网站| 丁香六月啪| 岛国福利在线精品播放| 欧美色图 人妻| 久久极品伊人| 久草这里只有精品| 老司机免费视频在线91| 99re3这里只有精品| 无遮挡h肉动漫在线观看| 中文字幕美女91| 国产精品久久久亚洲第一牛牛_在线观看 | 欧美丰满少妇xx高潮| 2017天天操| 天天躁夜夜躁狠狠躁AV| 成人A片男人的天堂| 在线只有精品| 免费观看有码高清视频| 激情久久av一区av二区av| 日韩中文字幕精品一区在线| 操操逼视频| 91人妻少妇| 天堂亚洲欧美| 亚洲91在线| 9久在线视频只有精品| 中文无线日韩一区| 狠狠爱夜夜干| 9999九九九久久久| 日韩不卡毛片Av免费高清| 加勒比aⅴ| 91无摭挡| 日韩精品9999| 久热精品色情| 97超碰无码网| 91大神电影天堂| 天天综合在线4| 老女人爆菊| 中文字幕 av v| 狠狠操狠狠| 欧美视频在线视频免费va| 91精品人| 26uuu久久| 中文字幕丰满子伦无码专区在线视频最新 | 色九九综合AV| 日本最新1区2区3区| 福利风月五月天影院| 青青草九九九九九| 六月丁香久久| 99只有精品| 99久热| 午夜天堂精品久久久久91| 97免费视频在线| a v网站在线播放| 日本免费一级AAA大片器| 欧美不卡在线一区二区| 啪啪啪东京| 国产AV色黄看到爽| 色妺妺AⅤ| 久久精品国产亚洲粉嫩| 欧美中文综合| 国产主播福利| 99久久e免费热视| 亚洲精品乱码久久久久久蜜桃麻豆| 热思思免费视频| 中国操逼无码| 啪啪综合网| 亚洲欧美成人网站AAA| 久久久四区| 亚洲欧美综合| 69少妇一区二区| 亚洲天堂男人网| 国产捆绑一区| 亚洲成人一区二区精品| 欧美精品一区二区少妇免费A片 | 蜜乳av一区二区三区| 欧美九一精品久久久熟妇| 欧美精品偷拍| 欧美在线视频观看一二三四区高清| 国产久久久9999| 亚洲AV不卡在线观看尤物| 都市激情人妻一区二区青青操视频 | 91久久精品国产| AV丝袜少妇| 91美女视频电影| 中国熟妇| 亚洲熟伦熟妇AV无码春色| 国产AV久久野战精品| 欧美日韩啪啪电影| 国模精品娜娜一二三区| 欧美网站免费| 欧美美女啪啪视频| 日本高清视频在线观看黄已三辽| 97一本大道亚洲一区| 9Ⅰ超碰| 综合激情二| 人看人人摸人人操| 啊啊啊啊啊好大好舒服想要| 加勒比无码毛片| 日本操逼aaaaa| 亚洲精品尤物yw在线影院| 成人av福利在线观看| 丝袜美腿制服人妻二区中文字幕| 97干在线视频| 久久久专区| 97国产精品一区| 999久久久免费精品国产牛牛| 欲香欲色| 亚洲一区二区性爱电影| 后入美女国产| 无人区高清电影免费观看一区二区三 www.qmcai2.com | 亚洲男人天堂2| 欧美人与动性人交a| 日本精品不卡一二三区| 97色论| 熟妇色99| 国产成人91一区二区三区| 国产小黄片在线免费观看| 精品大久久| 欧美在线干| 国内精品a| AAAAAAAAA黄片| 五月天黄色激情视频| AV一二区| 狠狠超| 97任你吞精| 精品久一区免费| 97色操| 人人操人人摸人人看人人干| 亚洲天堂99| 国产av热热色| 澳门黄片一香蕉视频| 一区二区三区探花在线观看| 人人摸人人干| 国产深夜福利| 欧美婷婷五月天| 欧洲大香蕉| 中字幕人妻一区二区三区| 国产福利在线视频网站| 五月婷婷丁香六月| 国产怡红院在线| 日韩欧美综合激情| 久久男人网| 亚洲精品一区二区日本| 日本在线一二| 色www精品视频在线观看| 亚洲加勒比久久日本道| 啪啪综合网| 久久久国产护士丝袜美腿一| h无码动漫在线观看| 97中文字幕色| 国产在线能看的你懂的| 欧美黑人精品一区二区| 久久免费老司机精品| 小草av不卡亚洲二区| 大二网站亚洲| 国产美女91视频| www久久国产精品| 欧美视频一区二区在线| 九九九九九九九九九九九蜜桃| 中文字幕精品码亚洲| 自拍鲍鱼一区在线高清观看免费| 亚洲永久AV无码精品秋霞| 亚洲97网站| 成人八戒网站| 成人精品欧洲亚洲| 日本一级性爱| 97久久久精品| 欧美黄片免费在线观看视频| 青女在线| 97超碰碰| 成人无码专区精品视频| A级片日韩欧美国产欧美视频精选观看 | 这里是精品| 亚州综合| 日本黄色裸日本黄色裸体| 免费啪啪av| 神马久久久久久久久久| 国产专区第一页| 无码操逼天堂| 久青草影院| 男人的天堂久久久| 精久久久91| 国产成年精品高清在线观看91| 人妻天天夜夜爽一区二区| 92久久| 久久久久久久久久久人妻| 中文字幕在线免费观看2| 丁香六月婷婷| 亚洲九九九| 婷婷五月天av| 美女裸体无遮挡永久免费观看网站 | 精品久久久高清无码| 亚爽爽爽爽爽爽爽爽| 亚洲成人福利电影免费| 欧洲视频在线| 日产国产精品中文久久婷婷| 性影在线视频| 日韩91网| 国产农村妇女精品1区二区| 日韩无码三级影院| 91视频女生| 亚洲综合网电影91| 国产精品麻豆成人av| 99精品丰满人妻| 色牛牛AV| 日本孕妇一区二区视频操逼免费看 | 射久久| 东京热激情视频一二三区| 欧美一区二区三区成人性生活| 99e久久国产精品| 国产精品一区二区 尿失禁| 中文字幕熟女人妻丝袜丝| 国产欧美日韩在线观看麻豆传媒公司| 91精品人妻一品二品三品| 亚洲操逼无码| 老熟妇乱轮| 国产成人无码高清| 97香焦色区| 亚洲精品性爱片| 亚洲狠狠入| 玖玖爱免费观看视频| 精品无码久久久| 欧美狠狠干| 少妇精品久久久| 91粉芽高清在线一区二区| 春色91| 97色色国产视频| 亚洲日本韩国在线| 大香蕉中文网| 97精品97| 乱伦熟妇一区二区| 中文有码9| 久久超碰免费的| 五月大香蕉| 精品丝袜无码一区二区三APP| 欧美A√综合网| 少妇人妻好深太紧了vr91| 国产一线二线三线av| 亚洲免费97免费| 日韩精品99999| 国产免费操逼| 亚洲AV成人精品网站在AV| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 亚州图片第一页| 亚洲图片欧美制度| 五月天成人综合| 欧美日韩国产三级黄色| 亚洲精品97久久中文字幕| 五月婷婷激情综合| 黑人操一区二区| 亚洲美腿丝袜香蕉影视欧美成人| 超碰79人人乐| 日本视频在线观看污污污| 超碰97极品9| 青青操在线亚洲视频观看欧美在线| 亚洲色图欧美色图日韩色图| 男人的天堂网页| 国产三级中文字幕粉嫩| 亚洲电影91| 人妻少妇蜜桃视频欧美一区| 五月婷婷大香蕉| 夜间福利片1000无码| 国产精品4p在线观看| 搡老女人老91二区| 久久香蕉超碰97国产精品| 中文字幕黑人大片| 五月天色综合| 欧美网站免费| 啪啪资源网| www.久久制服糖| 欧美精品二区视频在线| 91综合中文字幕| 97超碰超| 九九九九九九视频| 日本高清电影欧美色图| 黄色网址在线免费观看| 国语精品对白| 物业黑人 AV一区| 91色爽欧美| 青娱乐国产盛宴视频| 国产成人99久久亚洲综合| 亚洲在线91| 国产精品一区人妻精品阁在线| 中文字幕精品一区二| aa片毛片| 欧美三四五区| 精品无码久久| 国产路线专区| 亚洲情色综合| 中文久久| 热G综合热G中文| 色原狠狠天天天| 亚洲精品九九九九九九| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 9999亚洲精品| 秋霞鲁丝午夜无码一区二区三| 欧美黑人XXXⅩ高潮交| 日韩精品国产精品五码一区二区| 人人摸人人摸人人干| 自拍大香蕉乱插| 强奸乱伦AV一天堂网| 91一区二区三区蜜桃| 91高清欧美| 91久久久久| 竹菊一区二区三区AV线| 大香蕉狠狠爱| 一区二区三区国产在线播放| 强乱老妇中文字幕| 亚洲人妻久久| 久久精品国产AV一区二区三区| 国产精品乱码久久| 国产精品美女久久久久久网站| 91白虎| 搡老女人老熟女91老熟女综合网| 中文字幕av一区二区三区人妻少妇| 国产成人AV麻豆| 美女AV一区二区| 亚洲欧美在线综合| 91日日夜夜| 久久久啊啊啊| 国内精品久9| 大香蕉伊人75| 亚洲成人黄色在线观看| 噜噜噜在线视频| 国产真乱mangent| 日本欧美中文字幕| 天天噜| 97超碰磁| 100啪啪视频大全| 1000部熟女视频在线观看| 国产成人精品无码久久| 久久久九九网站| 青青草密桃在线播放| AV中文在线可看| 丰满翘臀美女影院视频| 日本好吊色视频| 亚洲黄色电影| 国产丝袜欧美在线视频| 操逼逼一区视频| 亚洲一区二区久久久久| 欧美夜夜狠| 日本中文字幕高跟| 99视频自拍区| 国产欧美日本亚洲精品| 日韩欧美经典在线观看| 精品久久久久瑟瑟| 亚洲激情深爱文学小说网站| rivers-china.com| 天天干人人看综合| 国产伦乱91| 欧美亚综合色图| 加勒比av网| 欧美色欧美| 乱伦3P视频| 好湿好紧好爽 视频| 嗯嗯啊啊的视频| 欧美超碰在线| 国内精品久久久久影院亚洲| 激情av| 美欧老女人97| 亚洲一区二区三区婷婷| 熟女精品va中文字幕| 麻豆久久视频在线地址| 果冻传媒一区二区三区| 超碰在线人妻中文字幕| 97色色色| 亚洲情色综合网| 亚洲欧美国产va在线播放频| 操99| 国产精品一级二级在线| 久久久久久综合久久伊人蜜月| 加勒比综合网| 丁香五月激情综合国产| 嗯~啊~快点 死我视频| 中文字幕欧洲有码| 夜夜操美女| 91小视频| 亚洲色香| 久久精品久久久久久久| 欧美一级黄色18片免费看| 97超碰热线| 在线97视频| 久色网| 久久久久久久久国产| 国产精品不卡一区二区三区av| www.av在线视频| 特级大荫道BBwBBwBBW| 国产美女精品| 美女高潮国产高清| 婷婷色五月激情| 东北操逼| 国产美女口爆吞精视频| 天天躁日日躁XXXXYY| 亚洲www91| 日韩电影在线观看网址| 亚州少妇| 九九九九久久久久| 黄色av片三级三级三级免费看| 天美AV片| 日韩欧美女求操每天更新| 中文字幕狠狠玩| 超碰久久网| 色色色色日本| 亚洲中文电影| 亚洲欧美洲综合| 两性综合网| 91黑丝操| 秋霞曰韩R级| 91欧美成人色站| 尤物网站91| 97国产精品国| 国产福利合集| 久久久98网站免费视频| 九九九色| 国产性刺激| 99色热| 欧美精品999| 97亚洲自在精品在线观看| 亚洲免费人妻在| 插插综合网天天影视网| 亚洲天堂热| 中文字幕激情小说| 色性综合| 国产精品成人AV片免费看网站 | 强奸乱伦中文字幕AV| 老熟女中文字幕高清| 99精品视频在线观看免费| 九九九九九九九九九九九九九九九女| 激情综合网亚洲| 成年男人的天堂| 欧美性爱日韩高清| 欧美日韩青操| 久久无码电影| 精人妻一区二区三区| 日韩三级视频一区二区三区| 日韩欧美亚洲自拍偷拍| 四色永久成人网站| 亚州综合色| 97人人中文网| 免费在线黄片视频| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 国产熟女自拍| 国产精品成人福利在线| 中出人妻中文字幕91在线| 色吧五月| 91在线视频国产网站| 久久综合18p| 久久久久99999| 欧美在线伊人色| 久久成人午夜精品影院 | 亚洲欧洲自拍| 国产一区麻豆免费观看| 18禁久极品美女久久哦哟呀!| 人人射人人操人人摸| 91痴汉| 日本国产成人亚洲精品无码| 免费视频97| 99操| 丁香五月婷婷基地| 无码精品久久久久久亚洲| 极品后入免费视频| 久久98| 91高潮| 999 久久久| 99操| 日韩黄色av中文字幕| 欧美日本视频一区| 黑丝少妇| 九九干| 少妇熟女一区二区三区| 大香蕉手机在线视频| yellow网站免费观看日韩高清无码| 天美传媒国产原创中文字幕亚洲欧美另类 | 先锋女优在线观看视频| 亚洲一区二区性爱电影| 精品一区二区三区免费古装毛片香港三级日本三级人妇 | 波多野42部无码喷潮在线观看| julia在线观看久久| 老司机深夜影院18未满| 婷婷人妻激情| 久久久久七视频| 免费观看啪视频| 日韩中文字幕视频| 日韩高潮一区| 91成人精品在线播放| 嗯嗯啊啊的视频| 少妇国产不卡| 九九人人操| 国产特级毛片AAAAAA高潮流水| 黑人精品久久97| 国产网红精品| 久艹日日日| 老司机午夜精品福利视频一区二区| 日韩欧美字幕亚洲一区二区 | 五十路熟女在线不卡观看一区二区| 99久久婷婷| 可以在线观看的黄色网址| 久久有码视频| 999日韩中文精品观看视频。| 国产极品粉嫩馒头一线天av| 中文字幕色AV| 亚洲第91页| 超碰久久性爱| 丁香五月偷拍| 在线无码操| 亚洲高潮影院| 久久视频,这里只有精品 | 中文字幕88av在线| 青青草中文-久久青草精品一区二区三| 国产一区在线播放| 日本色色色网站免费看不卡| 99av| 97AV在线免费观看| 五月丁香激情综合| 新版天堂中文资源8在线| 久久久久免费看少妇A片特黄| 蜜臀99999| 黄页大片在线观看| 国产成人一级av88| 久久精品国产欧美日韩亚洲欧美日韩中文久久国产一区 | 国产精品黑人一区二区三区| 97se综合| 欧色性第一页| 日韩精品99久久久久久中文字幕| 亚洲国产成人高清在线| 強姦亂倫a| 人人操人人爽人人操人人| 91熟女.com| 九一综合网| 99蜜桃臀亚洲成人在线观看| 精品人人| 黄色乱论网站| 97亚洲综合电影| 久久黄色网址| 中文字暮97| 亚洲 欧美 91| 丝袜六区| 欧美大码在线视频| 国产女上位好爽在线| 综合网欧美在线| 日本中文字幕在线视频| 日本精品成人无码| 翔田千里av一区二区三区| 熟女视频久久| 强奸乱伦AV网址| 国产精品福利视频播放| 欧美黄业| 熟女人妻一区二区三区免费看| 啊啊啊啊啊啊啊在线| 啊啊啊 在线观看| 美女啊啊啊啊pc| 精品女人999| 天堂蜜桃无码视频一区二区| 女人天堂AV五区在线| 搡老女人老妇女老妇老熟女怎么读| 3p国产色噜噜一区| 一区不卡在线观看av| 国产野战露脸在线播放| 黑人操一区二区| 人妻久久一区二区三区| 国产精品人妻无码久久久互動交流 | 嗯嗯啊啊操死我| 96精品久久久久中文字幕| 啊啊啊啊啊好大好舒服想要| 内射白嫩美女| 亚洲最大91网| 欧美 青青草| 亚洲天堂日本| caopeng97| 日韩三级在线观看mp4| 国产精品视频在线播放 | 亚洲精品视频二区| 亚洲不卡不卡中文字幕不卡| 中文字幕五区| 亚洲丝袜B诱惑| 每日更新AV| 国产久久久久久久久一区二区 | 久久久999日本大片| 国产视频三区四区| 顶级少妇BT天堂| 操亚州| 亚洲欧美综合图片| 日本爽爽爽爽爽爽免费视频| 欧美色欧美| 亚洲精品乱码线路中文字幕| 国产超碰| 五月天春色激情网| 综合天天。| 婷婷五月天激情四射| 久久午夜神马| 欧美A片中文字幕| 久久黄片国产一区二区| 2018天天日天天日| 九九探花视频在线观看| 天天综合亚在线| 亚洲人91| 天天欲望网| 国产精品探花色| 国产欧美精选激情视频| 免费强奸av| 亚洲情色五月天| 久久超碰、| 欧美久久久| 91丝袜美女视频| 欧美日韩在线小说 | 电家庭影院午夜69久久夜色精品国产69乱 | 欧美一区91大爱| 亚洲不卡AV在线| 97天天综合网| 少妇九九九九| 97精品免费视频网站| 国产女同在线观看视频| AV麻豆免费一区| 操逼大黄片| 中文字幕精品一区二区精| 99rre在线精品99re8| 欧美一区二区男人天堂| 中文字幕久热视频在线| 婷婷香蕉| 免费农村成人少妇人妻Aa一区二区视频| 日本精品成人无码| 亚州中文字幕超碰97| 伊人991| 午夜美女诱惑电源网| 免费岛国一级片| 欧美人体性爱互联网第一页婷婷日本| 偷拍 亚洲 欧美| 欧美性爱伊人| 2020国产精品| 91性高| 欧美一区二区三区不卡高清视频| 亚洲本色精品一区二区久久| 日本五十路熟女一区二区| 日韩欧美一级特黄大片| 午夜天堂网| 国产91 丝袜在线播放00-百度| 黑人娇小av在线播放| 日韩欧美亚洲一区二区三区影院| 国产免费久久久久| 蜜桃精品视频一区| 欧亚日韩中文在线| 在线综合 亚洲 欧美中文字幕| 日韩欧美成人午夜福利| 欧美专利1区2区3区4区5区免费| 欧美人妻色| 亚洲国产精品无码AV久久久| 香蕉在线一区二区三区| 婷婷五月天影院| 噜噜噜亚洲精| 操美女高潮抽搐白浆| 五月天人妻综合| 91三级理论片播放器| 国产第二页| 日韩亚洲中文有码视频| 91女优在线观看 | www成人啪啪18秘 免费| 成熟熟女国产精品一区二区| 翔田千里无码中出中文字幕| 久久九九一区二区三区成人| 亚洲熟伦熟妇AV无码春色| 少妇六月天| 国产精品麻豆免费视频| 欧美在线观看综合国产| 九九九九97| 亚洲影院无码在线| 97人亚洲综合字幕| 自拍偷拍国产欧美日韩韩| 精品国产精品一区二区| 啊啊啊啊好多水| 男人天堂婷婷五月天校园春色| 亚州九九九精品视频| 黄色av片三级三级三级免费看| 成年男人的天堂| 大香蕉www.超碰| 99re在线视频国产| 吻戏激情性巴克| …中文字幕亚洲乱,97人妻无码费视…| 青青免费在线视频一区| 老司机午夜福利视频一区二区| 亚洲无码电影久久久| 欧美日韩大陆黑人少妇99| 国产操逼网站亚洲一级黄色| 69精品人人人人| 欧美综合另类| 97在线资源| 天天天天干| 逼操网站| 99re98| 欧亚日韩综合精品国产| 激情小说五月天| 国产中文精品一区二区在线观看| 91色黑人少妇| 国产91福利小视频在线观看| 婷婷色香| 99激情| 欧美不卡二区| 欧美精品精品一区二区| 很狠操| 久久只有精品一区二区三区| 日韩在线观看中文字幕视频| 欧美Aⅴ| 91丝袜视频在线观看| 黄久在线| 亚洲日韩青青草色月| Julia在线播放亚洲久久| 青椒国产97在线熟女| 好爽要喷了| 97色视频在线| 97超碰色屌| 亚洲少妇色| 亚洲激情综合| 插日本熟女视频| 日本熟女中文字幕一区| 国产精品麻豆成人av| 99热在线播放| 国产日韩怡红院| 欧美激情 亚洲色图| 亚洲drav色图| 男人的亚洲天堂| 国产精品网站免费| 在线黄色污污网站| 亚洲综合码| 久插不卡| 欧美第38页| 影音先锋一区二区在线资源| 天天操女人| 欧美色图天堂网m| 97激情97激情| 伊人青青草久久| 熟妇高潮一区二| 日本好吊色视频| 伊人aaa| 亚洲极品| 国产精品69久久久久孕妇欧美 | 亚州色站 日韩电影| 安徽熟妇视频| 操操操操网黑人| 丰满人妻一区二区中文| 蜜桃精品一区二区三区久在线| 中文字幕 av v| 一区中文字幕二区日韩| 操一区| 加勒比久久av| 久草这里只有精品| 99久久国产精品免费高潮| 人妻丰满熟妇一区二区三| 中文字幕中文字幕一区二区| 黄网色一区二区三区四区精品| 亚洲电影中字一区二区| 国产不卡免费在线视频| 亚洲操逼无码| 久九干| 天美一区在线| 欧美97爱| 国产精品人人爽人人做可爱福利| 中文字幕国产在线天堂| 激情抓乳插进去啪啪啪日韩 | 男人天堂.AB| 天堂亚洲精品久久老牛| 天堂成人网| 亚洲蜜乳av| 亚洲黑丝在线| 欧美在线视频播放| 亚洲综合色图欧美| 一二三四视频中文字幕在线看| 一级毛片电影免费看| 91网九色蝌蚪操熟女| 大伊香蕉在线视频免费| 国产欧美一区二区| 青草伊人久久| 亚洲亚洲亚洲天堂天堂| 99少妇| 日本免费中文一区二区三区四区| 日本1区2区不卡视频| 黄色欧美性爱视频| 国产不卡片| 综合影院永久入口国产| 亚洲黄色a级片| 91丝袜激情在线| 天天插夜夜操| 久久免费精彩视频| 人妻丝袜一区二区三区在线| 99久久综合| 男女国产精品| 亚洲 日本 一 二 三| 国产精品福利视频| 国内自拍 日韩激情 99| 日天天九九天堂666| 久超碰在| 成 人 A V免费视频在线观看| 在线看片国产精品每日更新| 欧美 日韩 婷婷 五月| 逼操网站| 久久是精品| 少妇超碰在线| yiqicaoav| 国产久久久久影院老熟女| 国产亚洲禁久一区二区| 久久一区二区三区四区五区| 精品网站9999| 免费簧片在线观看| 久久久久久久9999| 青娱乐 成人娱乐在线| 亚洲资源一区| 91色艳| 国产亚洲美日韩Aⅴ中文字幕无码成人| 疯操AV| 黄色片大香蕉| 精品97精品97| 国产操逼视频在线观看| 福利风月五月天影院| a片久久久久久久久久久久 | 国产免费一区2区3区| 夫妻四区五区六区| 国产超碰AV在线精品| 91欧美丝袜| 亚洲啪啪视频一区二区| 澳门色噜噜色噜噜色噜噜色噜噜色噜噜| 天天摸夜夜添无码小视频| 熟女丝袜视频| 免费国产视频| 91操人视频| 色香天天| 久久人人妻| 精品日韩人妻视频| 青青操在线亚洲视频观看欧美在线 | 亚洲精品91| 国产精品乱人伊人网| 国产精品 久久久精品一牛| 人人天天欧洲| av天堂精品久久| 中文字幕精品三级久久久| 精品四五区| 欧美性生活免费网| 少妇专区一二三四五| 色婷婷av在线观看| 青娱乐福利99| 少妇精品| 欧美猛交黑寡妇中文字幕| 五月天激情小说| 无码久久国产| 日韩有码专区| 国产91丝袜在线播放蜜月| 色狠狠 - 百度| 午夜性生活av免费在线看| 欲色啪| 欧美色图私拍91| 九九九九九九九精品视频| 午夜乱轮操逼视频免费看| 97超碰巨乳| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 涩五月婷婷| 色爱三区| 东京热综合久久一区二区| 欧洲精品久久| 精品久久久久黄少妇| 蜜桃久久综合视频| 欧美日韩99| 99性爱在线观看| 国产欧美日韩一区二区三区| 欧美天天干| 91精品免费| 久操B网| 男人的天堂啪啪啪啪啪蜜桃不卡| 亚洲乱码精品一区二区| 91国模| 夜夜欧美 | 亚洲九九爱| 狠狠躁天天躁日日躁| 欧美内射少妇| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 97在线公开视频| 欧美日韩国产精品久久色婷婷| 国产丰满熟夫69mpp| 欧美日韩少妇色情| 中国黑人三级片网站上区| 超碰碰激情97+久| 无码视频一区二区| 玖玖草久草99蜜月一区二区三区| 亚洲情色电影网| 97超级久久强资源| 抽查国产福利主播| 久久夜嗨| 天天综合网合集91| 色婷婷A V一二三四区麻豆综合| 尻女朋友一夜| 久久亚洲人妻| 青青草字幕AV| 97人人夜| 熟女人妻一区二区三区| 蜜汁欧美| 日韩一级二级三级在线不卡观看完整| 俞拍自拍| 亚洲国产97| 精品人妻一区二区三区四区石在线| 欧美色视| 国产精品无码久久久久2025| yellow网站免费观看日韩高清无码| 日本一区二区三区免费观看| 成全在线观看免费观看| 久久久中文| 久久做97| 免费男人的天堂| 老子午夜伦不卡影院| 91热| 老鸭窝成人免费毛片视频| 日韩免费高清大片在线| www欧美性爱| 75大香蕉| 91欧美情色| 久久性爱精品一区| 亚洲宅男天堂| 东京热不卡视频| 国产精品999aaa| 丁香色五月 97干| 色第一页| 中文字幕97| 亚洲欧美经典一区二区| 91久久18禁| 天美传媒精品一区二区| 亚洲日韩美国人妻| 久久99亚洲精品久久99果| 国产成人主播| 国产久久久| 欧美亚洲日韩人妻在线观看| 色网综合网| 精品无码一区二区三区| 亚洲男人天堂Av| 91日日| 韩国免费播放一级毛片| 国产高清成人mv在线观看| 久久免费中文字幕在线观看| 大香蕉中文网| 激情色播| 亚洲人精品久久久| 黄色小视频日本txt| 精品视频久久区| 色97干| 日韩精品一区二区三区四虎影视| 99re视频在线观看这里只有精品| 久操 高清| 韩三级a视频在线观看| 亚洲黄网在哪免费看| 精品无码一区二区人妻久久蜜桃| 国产乱子伦一区二区三区在线观看| 亚洲av国产av综合av卡| 亚洲激情 欧美色图| 亚洲欧美综合| 欧中日成人免费影视| 日本成人免费一区二区三区| 校园春色 男人天堂 | 成人网站 免费观看| 久久精品人妻一区二区三区| 大香蕉伊人75| 性爱网站一区二区| 欧美日不卡| 亚欧洲一区二区视频| 人妻少妇被猛烈进入中| 国产熟女精品区| 天天日天天干天天整| 亚春色色| 麻花豆传媒剧国产MV出差| 老熟妇一区二区三区啪啪| 欧美日本成人一区二区| 人人手机欧洲亚洲国产人妻| 97超碰人人模人人拍人人| 欧美一级色| 久久男人的天堂| 亚洲天堂区| 啊啊啊啊操死我| 91在线美女| 中文一区在线视频| 成人性交午夜免费片| 天天干一区二区| 欧美少妇人妻| 96久久久精品| 日韩精品在线视频在线观看| 啊啊啊在线看| av绯色| 青青草好吊色| 亚洲男人天堂2013| 伊人色综合网| 少妇啪啪自拍| 18精品一二区| 成人熟女区| 67914亚洲精品| 亚洲天堂7777| 偷拍导航视频网站| 东北女人| 黄页大片在线观看| 欧美黄片视频在线观看免费| 超碰色老头| 夜夜做夜夜爽精品视频| av中文在线|