久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

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

Redis五大數(shù)據(jù)類型實戰(zhàn)詳解:原理、場景選型與排障

Redis五大數(shù)據(jù)類型實戰(zhàn)詳解:原理、場景選型與排障 1. 為什么先把數(shù)據(jù)類型想清楚比背命令更重要做后端開發(fā)的幾乎沒有人能繞開 Redis。緩存、分布式鎖、排行榜、消息隊列、計數(shù)統(tǒng)計樣樣都有它的身影。但我在面試和帶團隊時發(fā)現(xiàn)一個很有意思的現(xiàn)象很多人提到 Redis能熟練說出 String、Hash、List、Set、ZSet 這五種數(shù)據(jù)類型可一旦落到具體業(yè)務(wù)場景選型和命令就亂了套——有人用 String 存了一個巨大的 JSON有人用 List 做高可靠消息隊列還有人把排行榜硬生生做成了在數(shù)據(jù)庫里 ORDER BY。這些問題的根源不是命令不熟而是對數(shù)據(jù)類型的底層定位和適用邊界缺乏直覺。這篇內(nèi)容我準(zhǔn)備把這五種數(shù)據(jù)類型徹底拆開講透。不光是SADD 是加集合、ZADD 是加有序集合這種流于表面的操作符背誦而是每個類型解決什么問題、底層結(jié)構(gòu)如何影響性能、什么場景選它會自找麻煩、什么樣的 key 設(shè)計才算合理。你如果是剛接觸 Redis 的新手這篇文章可以作為完整的入門路線你如果已經(jīng)用 Redis 寫過業(yè)務(wù)代碼我相信里面關(guān)于大 key、編碼轉(zhuǎn)換、原子性誤區(qū)和排障經(jīng)驗的段落也能幫你補上一些平時沒太注意的盲區(qū)。我自己的習(xí)慣是拿到一個業(yè)務(wù)需求先不動手寫命令先畫數(shù)據(jù)模型再對著五種類型做映射。這一步做完整個方案基本就成型了。接下來我們把每個類型挨個過一遍從原理講到實戰(zhàn)再講講這些年我踩過的坑。2. String最基礎(chǔ)但最容易被用錯的類型2.1 String 的底層結(jié)構(gòu)和三種編碼形態(tài)String 是 Redis 最基礎(chǔ)的數(shù)據(jù)類型一個 key 對應(yīng)一個 valuevalue 最大能到 512MB。很多人以為 String 就是存字符串實際它的底層遠不止字符串這么簡單。Redis 為了在不同場景下做出性能最優(yōu)的選擇給 String 設(shè)計了三種編碼方式編碼觸發(fā)條件底層結(jié)構(gòu)intvalue 是整數(shù)且能用 long 表示直接存整數(shù)值不自帶 redisObject 的 sds 頭部embstrvalue 長度小于等于 44 字節(jié)一次性分配連續(xù)的 redisObject 和 sds 內(nèi)存rawvalue 長度大于 44 字節(jié)分兩次分配redisObject 和 sds 獨立內(nèi)存這個 44 字節(jié)的臨界值很多資料提過但沒講透。它其實是 Redis 內(nèi)存分配策略和緩存行對齊共同作用的結(jié)果jemallocRedis 默認內(nèi)存分配器在 64 字節(jié)以下會走 size class 分配redisObject 結(jié)構(gòu)本身占 16 字節(jié)SDS 頭部在 Redis 3.2 之后占 3 字節(jié)再加上結(jié)束符算下來能留給數(shù)據(jù)的空間就是 44 字節(jié)。超過這個值embstr 的連續(xù)內(nèi)存一次分配優(yōu)勢就保不住了轉(zhuǎn)為 raw 后讀寫需要兩次內(nèi)存分配性能會略降。我在實際項目中很少直接干預(yù)編碼切換但我會用 OBJECT ENCODING 命令檢查線上 key 的編碼狀態(tài)。以前排查過一個詭異問題某個存儲手機號的 String key平時寫入都正常偶爾一次寫入性能暴跌后來發(fā)現(xiàn)是因為某個手機號后面多了一個空格長度從 11 位變成 12 位編碼從 embstr 跳到 raw觸發(fā)了一次額外的內(nèi)存分配。這種問題很難從業(yè)務(wù)代碼層面察覺但只要你理解編碼機制排查方向就會清晰很多。2.2 單值緩存以外String 的經(jīng)典命令組合String 最常見的用法當(dāng)然是緩存單值比如用戶昵稱、商品庫存、接口返回的 JSON 片段。但 String 的價值不止于 SET/GET 這一對我給你列幾個我日常最高頻的命令組合每一個都有明確的場景指向。SETNX 是分布式鎖的最小實現(xiàn)。它的全稱是 SET if Not eXists只有在 key 不存在時才設(shè)置成功。配合 EXPIRE 設(shè)置過期時間就成了一版最簡分布式鎖 SETNX lock:order:1001 1 (integer) 1 EXPIRE lock:order:1001 30 (integer) 1當(dāng)然真實生產(chǎn)環(huán)境里建議直接用 SET 命令帶 NX 和 EX 兩個參數(shù)一次性完成 SET lock:order:1001 1 NX EX 30 OK為什么推薦用 SET 帶 NX EX 而不是先 SETNX 再 EXPIRE因為兩條命令組合不具備原子性中間如果 Redis 崩潰或網(wǎng)絡(luò)抖動鎖就沒有過期時間了直接變成死鎖。用一條 SET 命令就能把加鎖和設(shè)置過期合并成一個原子操作這個細節(jié)我在代碼評審里幾乎每次都會提。MSET/MGET 是批量讀寫的利器。一次網(wǎng)絡(luò)往返完成多個 key 的讀寫在高并發(fā)場景下能顯著降低 RTT 的影響 MSET user:1001:name zhangsan user:1001:age 28 OK MGET user:1001:name user:1001:age 1) zhangsan 2) 28這里要注意MSET/MGET 雖然是批量操作但它并不是原子的——中間某個 key 寫失敗不會回滾其他 key。如果你需要要么全成功要么全失敗的事務(wù)語義得用 MULTI/EXEC 包裹但那樣又會帶來性能開銷所以常規(guī)緩存場景用 MSET/MGET 就夠了別指望它承載事務(wù)。2.3 為什么容器類型嵌套的 String 不一定安全Redis 的 Hash、List、Set、ZSet 里存的值本質(zhì)上也都是 String。于是有一種常見的錯誤認知既然容器里的元素是 String那我是不是可以用同樣的 String 命令去處理它們我可以直接說結(jié)論不行。容器內(nèi)部的 String 不具備獨立 key 的性質(zhì)它沒有自己的 TTL、沒有自己的過期時間、不能被單獨設(shè)置 EXPIRE也不能被單獨設(shè)置訪問權(quán)限。為什么這樣說因為 Redis 的過期機制是以 key 為單位的。你給一個 Hash 設(shè)置了 EXPIRE整個 Hash 到點會被刪除但 Hash 里某個 field 想要單獨維持更長時間的存留普通版本 Redis 根本做不到。Redis 7.4 開始支持部分 Hash field 的過期特性但在 7.4 之前所有給某個 field 單獨設(shè) TTL的方案都是自己用另外的 key 去模擬。這個特性我在設(shè)計緩存方案時吃過虧。當(dāng)時給一個用戶維度的 Hash 設(shè)置了 1 小時過期其中某個 field 存的是特殊標(biāo)記需要保留 24 小時。我天真地以為可以單獨給那個 field 續(xù)期后來發(fā)現(xiàn)根本沒這個命令最后只能拆出一個獨立的 String key 來存這個標(biāo)記。這個教訓(xùn)讓我養(yǎng)成一個習(xí)慣凡是生命周期不一致的數(shù)據(jù)千萬別塞進同一個容器 key要么拆 key要么接受整體過期的約束。2.4 String 適合做的幾類小任務(wù)除了緩存和鎖String 還有幾個被低估的用法。第一類是計數(shù)器。INCR 和 DECR 是原子操作天然適合做訪問量、點贊數(shù)、庫存扣減。很多新人會用先 GET 再 SET來實現(xiàn)計數(shù)這在并發(fā)下會丟數(shù)正確姿勢永遠是直接 INCR/DECR讓 Redis 保證原子性。第二類是 Session 共享。分布式系統(tǒng)里用戶登錄狀態(tài)通常放在 Redis用 SETEX 設(shè)置會話 ID 和過期時間用戶每次請求都去 GET 一下。這個場景的關(guān)鍵是過期時間的粒度要匹配業(yè)務(wù)純接口鑒權(quán)可以設(shè)短一點比如 30 分鐘購物車這種需要長時間保留的狀態(tài)可以設(shè)長一些比如 7 天。第三類是分布式 ID 生成。INCR 一個全局 key就能拿到一個趨勢遞增的 ID。但要注意這個 ID 不能拿去當(dāng)數(shù)據(jù)庫主鍵因為 Redis 重啟后 INCR 會從持久化后的值繼續(xù)如果持久化策略是 RDB 快照重啟后可能丟掉最近幾次自增記錄會造成主鍵沖突。所以分布式 ID 建議用專門的雪花算法或者在數(shù)據(jù)庫層用號段模式Redis 的 INCR 只適合對順序不敏感的場景。3. Hash對象緩存和等值查詢的性價比之王3.1 為什么對象型數(shù)據(jù)我首選 HashString 類型存對象時有兩種常見但又各有局限的做法一是把整個對象 JSON 序列化后塞進一個 key查詢時整體反序列化哪怕只想取其中一個字段也要全量解析二是按對象屬性拆成多個 key多出大量 key 的維護成本。Hash 的思路則完全不同——它天生就是一個小對象容器一個 key 下面可以掛多個 field-value 對結(jié)構(gòu)上和對象幾乎一一對應(yīng) HSET user:1001 name zhangsan age 28 city hangzhou (integer) 3 HGET user:1001 name zhangsan HGETALL user:1001 1) name 2) zhangsan 3) age 4) 28 5) city 6) hangzhou當(dāng)業(yè)務(wù)方接口只返回用戶昵稱時HGET 一次到位當(dāng)丟給前端做詳情展示時HGETALL 一把梭哈非常靈活。和 String 方案相比Hash 最大的三個優(yōu)勢是單字段讀寫、批量字段讀寫、字段級邏輯控制。這些優(yōu)勢在緩存化改造中特別明顯——把老的 MySQL 行記錄映射成一個 Hash 時字段名和列名幾乎可以一一對齊改造成本極低。我用 Hash 做對象緩存的習(xí)慣是key 保持高扇出、可枚舉field 用穩(wěn)定的業(yè)務(wù)標(biāo)識。典型 key 設(shè)計是 user:1001、order:20231001 這種后面跟業(yè)務(wù) ID。如果業(yè)務(wù) ID 本身可能被重建或變化那就盡量避免把所有邏輯都掛在同一個 key 上因為 Hash 的過期是整體過期的一個 field 想單獨續(xù)期會變得很別扭。這一點在緩存與數(shù)據(jù)庫一致性方案里經(jīng)常被忽略——很多人以為 Hash 可以做字段級過期實際上官方在普通 Hash 上并不提供這個能力除非你用的是 7.4 以上版本且啟用了 hash field expiration 特性。3.2 HGETALL 的不當(dāng)使用與漸進式遍歷HGETALL 是個好命令但也很容易成為性能陷阱。當(dāng)一個 Hash 里有幾千個 field 時HGETALL 會一條命令把所有 KV 全部拉回來這個 O(N) 操作在大 key 場景下比預(yù)想中更危險。我之前接手過一個跑了兩年的老項目一個商品信息 Hash 因為運營不斷往里面加自定義屬性慢慢膨脹到幾萬個 field高峰期一個 HGETALL 就能把帶寬和 GC 拉爆。排查時我先執(zhí)行 HLEN 發(fā)現(xiàn) field 數(shù)量已經(jīng)上萬然后立刻讓線上讀按需取字段只讀接口用多個 HGET 精準(zhǔn)命中管理后臺才放行 HGETALL才把慢查詢壓下去。如果確實要全量讀或做遍歷推薦漸進式命令 HSCAN它和 SCAN 的思路一致可以分多次迭代取回全部 field-value每次返回一個游標(biāo)下次接著遍歷。HSCAN 返回的游標(biāo)并不是簡單的偏移量而是哈希桶的索引位置所以哪怕遍歷過程中有數(shù)據(jù)變化也能保證不錯的起始點位 HSCAN user:1001 0 MATCH name* 1) 0 2) 1) name 2) zhangsan這種做法適合做數(shù)據(jù)統(tǒng)計、批量遷移或后臺任務(wù)掃描但不適合高頻線上讀鏈路。線上讀服務(wù)永遠是精確命中離散取字段而不是拿著大鐵鍬去挖金礦。3.3 Hash 的內(nèi)存結(jié)構(gòu)與編碼轉(zhuǎn)換細節(jié)Hash 在元素較少時使用 ziplist緊湊列表編碼當(dāng)元素數(shù)量超過 hash-max-ziplist-entries 或單個 field 的 value 長度超過 hash-max-ziplist-value 時會轉(zhuǎn)換為 hashtable 編碼。這個轉(zhuǎn)換是透明的但會影響內(nèi)存占用和操作復(fù)雜度。我做過一次內(nèi)存實測100 萬個 field 的小值 Hash在 ziplist 編碼下內(nèi)存占用比 hashtable 編碼大概省 30% 到 40%讀取耗時差別也在毫秒級內(nèi)真正的差異主要發(fā)生在寫入時的 rehash 和內(nèi)存碎片上。實際操作中我會在配置里關(guān)注 hash-max-ziplist-entries 和 hash-max-ziplist-value 兩個參數(shù)。如果業(yè)務(wù)明確知道某個 Hash 的 field 數(shù)量上限很低可以把閾值調(diào)高一點盡量保持 ziplist 編碼以節(jié)省內(nèi)存但也要小心ziplist 編碼下的更新操作是 O(N)如果頻繁修改中間位置的數(shù)據(jù)性能反而會下降。我的經(jīng)驗是一個 Hash 的 field 數(shù)控制在幾百到幾千、單個 value 控制在幾百字節(jié)內(nèi)是比較舒服的范圍超過這個量級就要考慮是不是數(shù)據(jù)結(jié)構(gòu)選錯了。3.4 用 Hash 做短鏈映射、字典表與多指標(biāo)計數(shù)Hash 的應(yīng)用場景里我最常用的是三類。第一是短鏈映射。短鏈服務(wù)通常需要一個短碼到完整 URL的映射直接用 Hash 存一個短鏈庫就是一個大 Hash訪問時 HGET 一下生成時 HSET 一下天然支持批量導(dǎo)入。第二是字典表。電商后臺會有一堆枚舉值狀態(tài)碼、城市碼、類目碼這種配置型數(shù)據(jù)按業(yè)務(wù)模塊拆成多個 Hash例如 config:city 存所有城市編碼和名稱config:category 存類目樹。后臺修改配置時 HSET 某個字段不影響到其他字段也不用為每個配置單獨建一個 String keykey 數(shù)量大幅下降。第三是多指標(biāo)計數(shù)。比如記錄某篇文章的點贊、收藏、評論數(shù)用 Hash 的 field 分別保存 post:1001:stat 的 like、fav、comment每次更新用 HINCRBY 原子累加讀取時 HMGET 一次拿多個指標(biāo)不用為每個指標(biāo)單獨建 key。這一招在實時數(shù)據(jù)大屏、運營看板里非常常見邏輯簡單但非常穩(wěn)。Hash 還有一個被低估的優(yōu)勢是批量寫入和批量讀取的對稱性。業(yè)務(wù)方要批量初始化一批對象時可以先用 HM?SE T一次寫入多個 field再在查詢時用 HMGET 一次性取多個 field。這種對稱設(shè)計在接口層很容易和前端表單字段對齊我寫緩存服務(wù)時特別偏愛這種對齊感——數(shù)據(jù)模型和接口模型一致代碼可讀性極高排查問題時一眼就能看清數(shù)據(jù)流向。4. List時間線、隊列與操作記錄的一把好手4.1 List 在 Redis 里的真實定位很多人一提到 List 就下意識說消息隊列這個印象不奇怪LPUSH 加 BRPOP 的組合確實可以做出一個簡單的隊列。但 List 在 Redis 五大類型里其實更偏線性結(jié)構(gòu)的存在它既是棧又是隊列既可以左進右出也可以左進左出完全取決于你怎么用。而它真正的實力在于順序性、長度控制和時間窗口記錄。List 的內(nèi)部存儲是一個雙向鏈表結(jié)構(gòu)所以頭尾插入刪除都是 O(1)但中間位置的隨機訪問則是 O(N)。Redis 的 List 在早期實現(xiàn)里直接用 linkedlist后來為了節(jié)省內(nèi)存又引入了 quicklist一種以 ziplist 為節(jié)點的雙向鏈表。我自己的理解是List 適合所有按時間順序追加、按批次消費的場景不適合高頻隨機查找。如果你要按索引下標(biāo)取值比如取第 1000 個元素List 會慢到你想罵人這時候應(yīng)該考慮用其他結(jié)構(gòu)而不是硬扛。4.2 LPUSH 加 LPOP / RPOP從隊列到棧的完整組合List 的命令很多核心就幾組。先看最常用的隊列語義 LPUSH task:queue job1 job2 job3 (integer) 3 RPOP task:queue job1 RPOP task:queue job2LPUSH 從左側(cè)寫入RPOP 從右側(cè)彈出先進先出這就是一個標(biāo)準(zhǔn) FIFO 隊列。反過來LPUSH 加 LPOP 就是 LIFO 棧。如果想讓消費端在隊列為空時阻塞等待可以用 BRPOP這樣消費端不會高頻空轉(zhuǎn)輪詢能大幅降低無謂的 Redis 訪問壓力 BRPOP task:queue 5 1) task:queue 2) job3這個 5 表示阻塞 5 秒超時返回空。我在做任務(wù)調(diào)度時經(jīng)常用 BRPOP 配合超時時間消費線程掛在那里隊列一來就立刻被喚醒隊列空閑時也不會反復(fù)產(chǎn)生請求。有一個值得注意的點BRPOP 返回的是key 和 value兩部分因為你可能同時阻塞監(jiān)聽多個 key所以返回值里第一項是哪個 key 有數(shù)據(jù)第二項才是具體數(shù)據(jù)代碼里別取錯。4.3 用 List 做時間線和操作記錄LTRIM 的妙用List 的另一個高頻場景是最新動態(tài)和操作記錄。比如用戶的最近瀏覽記錄、系統(tǒng)的最近告警、文章的最新評論都有同一個共性只關(guān)心最新的 N 條歷史數(shù)據(jù)要么歸檔要么丟棄。實現(xiàn)思路很經(jīng)典 LPUSH user:1001:recent_posts post:9001 post:9002 post:9003 (integer) 3 LTRIM user:1001:recent_posts 0 2 OK LRANGE user:1001:recent_posts 0 -1 1) post:9003 2) post:9002 3) post:9001LPUSH 之后立刻 LTRIM 只保留前 N 條就構(gòu)成了一個容量固定的滑動窗口。你在微博、抖音時間線里看到的那種只保留最近一屏的列表底層很多就是這種思路。LTRIM 是 Range 保持的精髓它把超出窗口的內(nèi)容一次性剪掉不寫代碼、不跑定時任務(wù)一條命令就把 List 的容量控制住了。這里有個坑我必須多提一次LRANGE 返回的順序是從左到右。你 LPUSH 進去的數(shù)據(jù)在左側(cè)所以 LRANGE 0 -1 返回的第一條是最新寫入的。很多新人在這一點上栽過跟頭——他們以為 List 和數(shù)據(jù)庫查詢結(jié)果一樣順序按插入時間正序結(jié)果一測發(fā)現(xiàn)最新的在最前面日志里和預(yù)想不符排查半天。我建議寫代碼前先在命令行里手動 push 三條數(shù)據(jù)感受一下順序再進代碼寫邏輯別靠想象寫。4.4 List 作為消息隊列的痛點與替代方案雖然 LPUSH 加 BRPOP 能做隊列但如果你想用 List 在生產(chǎn)環(huán)境做重邏輯的消息隊列我勸你先想清楚幾個限制。消息丟失風(fēng)險。BRPOP 彈出并返回數(shù)據(jù)后如果消費端在處理消息時崩潰這條消息就再也取不回來了。相比之下專業(yè)的消息隊列比如 RabbitMQ、Kafka 都有消費確認機制Redis Stream 則提供了消費者組和 PEL待處理條目列表來保證消息可追蹤。消息積壓時內(nèi)存膨脹。List 是一個純內(nèi)存結(jié)構(gòu)消息堆積多了Redis 內(nèi)存直接開始報警。消息隊列有磁盤緩沖能力但 Redis List 沒有。如果消息量預(yù)估很大要么考慮 Stream要么考慮外部的消息隊列中間件。重復(fù)消費問題。List 消費端拿走了消息消息就沒了所以也不存在重復(fù)消費和冪等設(shè)計的余地。如果你需要的是每個消息被多個消費者各自處理一次List 根本實現(xiàn)不了這是 Stream 的消費者組才有的能力。我對 List 做隊列的態(tài)度很簡單適合輕量級任務(wù)、低頻打點、單消費者場景不適合多消費者、高可靠、大量積壓的場景。后者的合理選擇是 Redis Stream如果連 Stream 都滿足不了可靠性要求那就直接用專業(yè)消息隊列別硬湊。5. Set標(biāo)簽、去重與隨機抽樣的標(biāo)準(zhǔn)答案5.1 Set 的底層與去重邏輯Set 是一個無序、不重復(fù)的集合。它的底層實現(xiàn)有兩種編碼元素全是整數(shù)且數(shù)量少時用 intset整數(shù)集合元素是字符串或數(shù)量較大時用 hashtable。無論哪種編碼Set 都能保證添加重復(fù)元素時靜默忽略、不重復(fù)存儲。這一條命令實測就能證明 SADD tag:1001 java redis java (integer) 2 SMEMBERS tag:1001 1) java 2) redisSADD 返回 2說明第二個 java 被忽略了。這個去重能力是天然的不需要你在業(yè)務(wù)代碼里維護一個曾見過的清單。我在做去重邏輯時最省事的方案就是直接用一個 Set 的 key 存儲所有已處理的 ID每次新數(shù)據(jù)進來用 SISMEMBER 或 SADD 來判斷。SISMEMBER 返回 1 說明存在返回 0 說明不存在如果你想把判斷加加入合成一步那就看 SADD 的返回值——返回 1 說明添加成功原本不存在返回 0 說明原本就存在加了個寂寞。5.2 SADD/SREM/SISMEMBER集合操作與用戶標(biāo)簽實戰(zhàn)Set 最常見的場景是給用戶打標(biāo)簽。內(nèi)容平臺要給用戶打上科技愛好者數(shù)碼達人籃球迷等標(biāo)簽用 Set 來做就是 SADD user:1001:tags 科技 數(shù)碼 籃球 (integer) 3 SREM user:1001:tags 科技 (integer) 1 SISMEMBER user:1001:tags 數(shù)碼 (integer) 1標(biāo)簽的增刪查改都變成了集合操作非常自然。更妙的是當(dāng)需要知道同時打了 A 標(biāo)簽和 B 標(biāo)簽的用戶時可以直接用 SINTER 求交集不用在業(yè)務(wù)代碼里做雙重循環(huán)。舉一個實際場景運營想篩選既關(guān)注數(shù)碼話題又活躍的用戶維護兩個 Set一個存關(guān)注數(shù)碼話題的用戶 ID一個存活躍用戶 ID然后 SINTER 取交集一次拿到人群包。這種基于 Set 的交并集運算在推薦系統(tǒng)的人群圈選里是標(biāo)配。5.3 隨機類場景SPOP 和 SRANDMEMBER 的區(qū)別抽獎是 Set 的經(jīng)典玩法但 SPOP 和 SRANDMEMBER 兩個命令的分工經(jīng)常被搞混。SPOP 會從集合中隨機移除一個元素并返回它SRANDMEMBER 則只是隨機返回一個或多個元素不會移除。對應(yīng)到業(yè)務(wù)上抽獎發(fā)獎獎品發(fā)放后不能重復(fù)發(fā)用 SPOP隨機展示推薦位、隨機抽一個用戶做調(diào)查但不改變用戶池用 SRANDMEMBER SADD lottery:20240101 u1 u2 u3 u4 (integer) 4 SPOP lottery:20240101 u2 SRANDMEMBER lottery:20240101 2 1) u3 2) u4我見過一個活動組的同學(xué)在抽獎接口里用 SRANDMEMBER 抽獎結(jié)果一個用戶被抽中兩次因為元素還在集合里。后來改成 SPOP中獎用戶立刻出池問題就沒了。另一個細節(jié)是 SPOP 支持 count 參數(shù)SPOP lottery:20240101 3 可以一次抽出 3 個不同的元素保證互不重復(fù)這在批量抽獎里非常實用不需要在代碼里循環(huán)多次調(diào) SPOP。5.4 Set 做存在性判斷從黑名單到布隆過濾器的取舍Set 還可以承擔(dān)一部分布隆過濾器的職責(zé)判斷一個元素是否存在時用 SISMEMBER時間復(fù)雜度 O(1)。比如黑名單、白名單、已讀列表、已發(fā)放權(quán)益列表都可以用 Set 來存。和布隆過濾器相比Set 的優(yōu)點是精確、無誤差缺點是內(nèi)存占用較高——每個元素都要真實存儲在內(nèi)存中。我在實戰(zhàn)中的做法是如果集合規(guī)模小幾萬到幾十萬直接用 Set 做存在性判斷省心省力如果規(guī)模到了千萬級甚至億級Set 內(nèi)存頂不住才考慮布隆過濾器。這里有一個折中的技巧可以把 Set 的 key 按業(yè)務(wù)維度切片比如 user:100x:blacklist把一個巨大的集合拆散到多個 key 上分擔(dān)單 key 的壓力同時讓 SISMEMBER 的命中路徑更短。切片的粒度要結(jié)合實際查詢模式別切出幾十萬個 key 把管理搞癱瘓。6. Sorted Set排行榜、延遲隊列與范圍查詢的關(guān)鍵武器6.1 Score 的含義與排序規(guī)則Sorted SetZSet是 Redis 五種類型里最特別的一個它給每個元素關(guān)聯(lián)了一個 double 類型的 score元素按 score 從小到大排序。如果你有復(fù)雜排序需求且同時要求插入性能ZSet 幾乎是唯一選擇。它的排序是穩(wěn)定的score 相同時按元素的字典序member 的字符串順序排列。 ZADD ranking:game 100 playerA 200 playerB 150 playerC (integer) 3 ZRANGE ranking:game 0 -1 WITHSCORES 1) playerA 2) 100 3) playerC 4) 150 5) playerB 6) 200注意 ZRANGE 默認是從小到大取也就是升序。如果你要排行榜從高到低可以用 ZREVRANGE從大到小或者 ZRANGE 加 REV 參數(shù)。很多面試題里會問ZSet 底層是什么答案是跳躍表加哈希表跳表負責(zé)排序和范圍查詢哈希表負責(zé) O(1) 查找元素對應(yīng)的 score。理解這一點你就明白了為什么 ZSet 能做按 score 取排名按排名取元素按 score 區(qū)間取元素三種維度的查詢而且效率都很高。6.2 ZADD/ZSCORE/ZRANK排行榜的完整實現(xiàn)路徑寫一個排行榜功能是 ZSet 的入門實操步驟并不復(fù)雜。第一步數(shù)據(jù)寫入。用 ZADD 把玩家 ID 和分數(shù)寫入 ZADD ranking:202401 1000 playerA (integer) 1 ZADD ranking:202401 1200 playerB (integer) 1 ZADD ranking:202401 800 playerC (integer) 1第二步查詢 TopN。用 ZREVRANGE 拿到榜單前三 ZREVRANGE ranking:202401 0 2 WITHSCORES 1) playerB 2) 1200 3) playerA 4) 1000 5) playerC 6) 800第三步給某個玩家加分。用 ZINCRBY 在現(xiàn)有 score 上累加 ZINCRBY ranking:202401 100 playerC 900第四步查某個玩家的排名。ZRANK 返回的是從 0 開始的升序排名ZREVRANK 返回降序排名 ZREVRANK ranking:202401 playerB (integer) 0有了這四步一個帶排名、加分、名次查詢的完整排行榜就通了。我在做排行榜時還會注意一個細節(jié)如果數(shù)據(jù)量很大ZRANGE 全量取出會導(dǎo)致網(wǎng)絡(luò)傳輸壓力很大所以接口層必須要分頁。很多新手直接 ZREVRANGE 0 -1 把整個排行榜拖回內(nèi)存再在內(nèi)存里分頁這是非常典型的性能反模式。正確做法是在 Redis 端就用 ZREVRANGE 的 start 和 stop 參數(shù)做分頁只拿當(dāng)前頁需要的數(shù)據(jù)。6.3 ZSet 做延遲隊列的兩種思路與同分陷阱延遲隊列是 ZSet 的隱藏神技。思路很簡單把任務(wù)的執(zhí)行時間戳作為 score消費者用 ZRANGEBYSCORE 去拿到點該執(zhí)行的任務(wù)。我常用的實現(xiàn)方式有兩種。方式一輪詢掃描 ZADD delay:queue 1735689600 task:1001 ZRANGEBYSCORE delay:queue 0 1735689600 WITHSCORES LIMIT 0 10用一個后臺線程定時執(zhí)行 ZRANGEBYSCORE把 score 小于當(dāng)前時間的任務(wù)取出來處理完再 ZREM 刪除。這個方案簡單、可控適合任務(wù)量不大的場景。方式二阻塞型使用 BZPOPMIN 可以阻塞等待score 最小且已被加入到集合中的元素彈出。但要注意BZPOPMIN 彈出的是整個 ZSet 中 score 最小的元素不是小于某個閾值的所有元素。所以如果你想實現(xiàn)嚴(yán)格的延遲隊列更穩(wěn)妥的還是輪詢方式。我再補充一個坑ZSet 的 score 是 double 類型用毫秒時間戳做 score 時精度完全夠但如果你用秒級時間戳同一秒內(nèi)大量任務(wù)會落到同一個 scoreZRANGEBYSCORE 的范圍取法就要額外考慮同秒任務(wù)的順序否則同一秒的任務(wù)你可能只取到一部分。做法是把時間戳精確到毫秒或者在任務(wù)里附帶一個自增序號來打破同分競爭。6.4 范圍查詢與冷熱數(shù)據(jù)的分級處理ZSet 里還有一個非常強大的能力就是按 score 范圍做切片查詢ZRANGEBYSCORE min max。做冷熱數(shù)據(jù)分級時可以把數(shù)據(jù)的最近活躍時間作為 score然后按時間窗口切出近期活躍和沉睡用戶。 ZADD active:users 1735689600 u1 ZADD active:users 1735603200 u2 ZRANGEBYSCORE active:users 1735603200 1735689600 1) u2 2) u1這個操作直接回答了哪些用戶在過去 24 小時內(nèi)有活躍行為。相比用時間戳字段去數(shù)據(jù)庫走索引ZSet 的優(yōu)勢是全內(nèi)存、O(log N) 的范圍查找、天然按時間排序。在一些用戶分層、營銷人群圈選的系統(tǒng)里這種用法非常常見。同樣要提醒ZSet 是內(nèi)存結(jié)構(gòu)存幾十萬上百萬元素還好千萬別把全量用戶都塞進一個 ZSet內(nèi)存和寫入壓力扛不住。要按業(yè)務(wù)域拆 key例如 active:202401、active:202402每個月一個新 key。6.5 ZSet 與 List、Set 的選擇取舍最后把決策問題講清楚。如果你還不知道某個場景該用 List、Set 還是 ZSet可以按這個思路判斷需要先進先出、按容量剪裁優(yōu)先 List需要唯一性、快速求交并集、隨機抽取優(yōu)先 Set需要按分數(shù)排序、按范圍取 TopN、帶權(quán)重取元素優(yōu)先 ZSet一個很好的類比是List 像排隊打飯的隊伍Set 像一個去重后的集合ZSet 更像一個帶分數(shù)標(biāo)簽的有序排行榜。它們之間的轉(zhuǎn)換也經(jīng)常出現(xiàn)比如你先用 List 收集了一批待處理任務(wù)在去重環(huán)節(jié)轉(zhuǎn)成 Set最終需要按優(yōu)先級執(zhí)行時再轉(zhuǎn)成 ZSet。Redis 類型不是死的關(guān)鍵是每種類型擅長解決什么問題。7. 內(nèi)部編碼、內(nèi)存優(yōu)化與命令選型的經(jīng)驗總結(jié)7.1 五種類型的內(nèi)部編碼對照很多面試題里會問 Redis 的 encoding但實際調(diào)優(yōu)中它也是最有用的信息因為直接決定了內(nèi)存和性能。不同數(shù)據(jù)類型在不同條件下走不同編碼數(shù)據(jù)類型小數(shù)據(jù)量編碼大數(shù)據(jù)量編碼觸發(fā)轉(zhuǎn)換的關(guān)鍵配置Stringint / embstrraw字符串長度超過 44 字節(jié)走 rawHashziplisthashtablehash-max-ziplist-entries / hash-max-ziplist-valueListquicklist內(nèi)含 ziplistquicklistlist-max-ziplist-size / list-compress-depthSetintsethashtableset-max-intset-entriesZSetziplistskiplist dictzset-max-ziplist-entries / zset-max-ziplist-value我并不是建議你去背這些配置而是建議你在內(nèi)存水位異常時用 OBJECT ENCODING key 或 DEBUG OBJECT key 去看一個 key 當(dāng)前的編碼 OBJECT ENCODING user:1001 ziplist DEBUG OBJECT user:1001 Value at:0x7f9f1c44b920 refcount:1 encoding:ziplist serializedlength:83 lru:4823112 lru_seconds_idle:120如果發(fā)現(xiàn)原本預(yù)期走緊湊編碼的 key 變成了 hashtable 或 raw往往是因為某個 value 太大或字段太多觸發(fā)了轉(zhuǎn)換。這時候你該做的不是盲目調(diào)大閾值而是審視數(shù)據(jù)模型是否合理。比如一個 Hash 的 field 漲到上萬個那不該調(diào)高 ziplist 閾值而是應(yīng)該把大 Hash 拆成多個小 Hash按業(yè)務(wù)分桶。7.2 內(nèi)存優(yōu)化從 key 命名到緊湊編碼的三個層次Redis 內(nèi)存優(yōu)化的話題很容易被忽視因為很多人只有當(dāng)內(nèi)存報警時才想起看但那時已經(jīng)晚了。我給出的優(yōu)化思路有三個層次。第一層控制 key 的數(shù)量與長度。一個 key 的名稱哪怕只多 20 個字節(jié)1000 萬個 key 就多出 200MB 內(nèi)存這還不算哈希表本身的膨脹。所以 key 命名要短而可讀比如 user:1001 而不是 full_user_name:1001:profile_cache:001。我看到過長 key 把內(nèi)存占到 30% 以上的真實案例教訓(xùn)是命名的長度直接影響內(nèi)存成本。第二層優(yōu)選緊湊編碼。在前面編碼對照表里ziplist、intset、embstr 都是緊湊編碼在數(shù)據(jù)量小時內(nèi)存效率遠高于 hashtable 和 raw。合理設(shè)置閾值盡量讓小數(shù)據(jù)保持緊湊形態(tài)。需要提醒的是緊湊編碼下的讀性能未必差只是寫路徑更脆因為寫入可能觸發(fā)編碼轉(zhuǎn)換。所以更建議根據(jù)業(yè)務(wù)規(guī)模預(yù)估來設(shè)置閾值而不是拍腦袋把參數(shù)調(diào)大。第三層利用 key 聚合減少元數(shù)據(jù)開銷。Redis 每個 key 都要維護元數(shù)據(jù)類型、編碼、LRU、引用計數(shù)等key 數(shù)量越多元數(shù)據(jù)開銷越大。把業(yè)務(wù)上相關(guān)聯(lián)的子數(shù)據(jù)聚合到一個 Hash/ZSet/Set 里能顯著減少 key 的數(shù)量。比如點贊、收藏、評論三個計數(shù)用一個 Hash 存三個 field比用三個 key 存三個值更省內(nèi)存。但聚合也要有度單 key 過大又會導(dǎo)致讀寫放大所以聚合和拆分要根據(jù)實際訪問模式來平衡。7.3 O(N) 命令的紅線KEYS、HGETALL、SMEMBERS、LRANGERedis 在單線程模型下一個慢命令會阻塞所有其他命令。常用的 O(N) 命令里有幾個經(jīng)典紅線是必須記住的KEYS生產(chǎn)環(huán)境等于自殺千萬別用用 SCAN 代替HGETALL大 Hash 下會阻塞用 HSCAN 或按需 HGETSMEMBERS大 Set 下的全量輸出同理用 SSCANLRANGE大 List 下全量輸出同理按需 LRANGE start stopZRANGE大 ZSet 下全量輸出同理分頁取這里多說一句Redis 會為慢命令記錄 slowlog配置 slowlog-log-slower-than 可以設(shè)置閾值。實際排障時我經(jīng)常用 SLOWLOG GET 定位那些拖垮實例的罪魁禍?zhǔn)住=ㄗh上線前就把慢日志打開閾值設(shè)在 10 毫秒左右生產(chǎn)環(huán)境一旦出現(xiàn)慢查詢就知道誰在搗鬼 SLOWLOG GET 10 1) 1) (integer) 102 2) (integer) 1735689600 3) (integer) 2300 4) SLOWLOG7.4 類型選擇決策表遇到業(yè)務(wù)需求先查這張表我把常見業(yè)務(wù)需求直接映射到對應(yīng)的數(shù)據(jù)類型方便你直接抄作業(yè)。這份經(jīng)驗匯總不保證覆蓋所有場景但能覆蓋八成常見需求業(yè)務(wù)需求推薦數(shù)據(jù)類型關(guān)鍵命令緩存單值、分布式鎖StringSET / GET / SETNX / SETEX緩存對象、按字段讀寫HashHSET / HGET / HGETALL會話、驗證碼短期存儲StringSETEX / GETDEL最新動態(tài)、時間線ListLPUSH / LTRIM / LRANGE輕量消息隊列ListLPUSH / BRPOP可靠消息隊列Stream或外部 MQXADD / XREADGROUP用戶標(biāo)簽、去重SetSADD / SISMEMBER / SINTER隨機抽獎SetSPOP / SRANDMEMBER排行榜、TopNZSetZADD / ZINCRBY / ZREVRANGE延遲隊列ZSetZADD / ZRANGEBYSCORE / ZREM全局唯一計數(shù)StringINCR / DECR大規(guī)模存在性判斷RedisBloom布隆過濾器BF.ADD / BF.EXISTS這張表是我做技術(shù)選型時的第一反應(yīng)表。它不解決這個業(yè)務(wù)到底要不要用 Redis的問題只解決確定了用 Redis 之后該用哪個類型的問題。接下來再想清楚 key 生命周期、過期策略、與數(shù)據(jù)庫的一致性整個方案就已經(jīng)成型了一半。7.5 從五大類型到 Stream、Bitmaps、HyperLogLog 的延伸寫完五大類型必須提一句 Redis 不止這五種。官方容易被忽視的還有 Bitmaps、HyperLogLog、Stream、地理空間類型 Geo。它們各有絕活Bitmaps 做在線狀態(tài)統(tǒng)計極省內(nèi)存HyperLogLog 用 12KB 就能做千萬級基數(shù)統(tǒng)計Geo 直接支持附近的人或店鋪查詢Stream 則彌補了 List 做可靠消息隊列的短板。我平時的習(xí)慣是先用五大類型解決 80% 的需求再根據(jù)場景引入這些專項類型。它們不是越多越好而是搞清楚每種類型在天平上的位置——內(nèi)存、準(zhǔn)確度、實時性、可靠性四個維度分別取舍。8. 實際部署中的幾個翻車現(xiàn)場與搶救記錄8.1 大 Value 引發(fā)的阻塞與拆分真實翻車案例一某個老項目里用一個 String key 存儲了十幾 MB 的 JSON 數(shù)據(jù)啟動時一次性讀取平時基本不更新。結(jié)果某天業(yè)務(wù)方大量請求這個 keyRedis 響應(yīng)突然飆到幾百毫秒。我用 STRLEN 檢查發(fā)現(xiàn) value 已經(jīng)很大又用 SLOWLOG 確認 GET 操作本身就是慢查詢。之所以慢不完全是網(wǎng)絡(luò)傳輸問題而是這個 key 的數(shù)據(jù)在 Redis 內(nèi)部要經(jīng)歷序列化、內(nèi)存拷貝、網(wǎng)絡(luò)輸出三個階段每個階段都被放大。后來我把這個 String 拆成多個小 key 按字段存儲或者改用 Hash 按字段讀取問題迎刃而解。這里的關(guān)鍵教訓(xùn)是Redis 不適合存大對象超過幾百 KB 就要拆。真遇到不能拆的比如整存整取的外系統(tǒng)接口數(shù)據(jù)那就做好緩存失效策略和網(wǎng)絡(luò)超時并接受延遲上升的事實。8.2 過期策略與內(nèi)存淘汰的組合拳很多人在一個 Redis 實例里同時設(shè)置 TTL又開啟了 allkeys-lru 淘汰結(jié)果發(fā)現(xiàn)數(shù)據(jù)早早就被淘汰了總是丟失。這里有兩個機制的名字只差一字但行為截然不同過期機制expire是主動把過期數(shù)據(jù)刪除內(nèi)存淘汰eviction是在內(nèi)存達到 maxmemory 時按策略挑選 key 刪除。如果實例內(nèi)存很小又開了 allkeys-lru那么即使 key 還沒到 TTL也可能被 LRU 策略提前淘汰。解決辦法依據(jù)業(yè)務(wù)特點來定緩存型數(shù)據(jù)可以接受淘汰用 volatile-lru 或者 allkeys-lru 都行但像分布式鎖、限流計數(shù)這種狀態(tài)型數(shù)據(jù)絕不能依賴淘汰策略一定要設(shè)置合理的 TTL 并考慮持久化。另一個相關(guān)的坑是過期鍵在從庫上不會主動刪除。Redis 主從架構(gòu)里過期鍵的處理是主庫負責(zé)刪除然后向從庫發(fā)送 DEL。如果從庫被提升為主庫在舊主庫發(fā)送刪除命令之前從庫上的這些數(shù)據(jù)可能仍然可讀——這是主從切換后偶爾出現(xiàn)臟數(shù)據(jù)的一個原因。要減少這個窗口需要關(guān)注 repl-disable-tcp-nodelay 和同步延遲或者使用 Redis 7 的 WAITAOF 等機制提升數(shù)據(jù)一致性。8.3 用 MEMORY 和 OBJECT 命令做常規(guī)體檢真正的排障高手不會等故障發(fā)生才動手而是定期給 Redis 做體檢。我最常用的三個命令第一個是 MEMORY USAGE key查一個 key 實際占用內(nèi)存 MEMORY USAGE user:1001 (integer) 136第二個是 INFO memory查整體內(nèi)存分布、碎片率 mem_fragmentation_ratio 等 INFO memory # Memory used_memory:826032 used_memory_human:806.67K used_memory_rss:2396160 mem_fragmentation_ratio:2.90碎片率長期大于 1.5 或小于 1都要關(guān)注。大于 1.5 說明內(nèi)存碎片嚴(yán)重可以考慮啟用 activedefrag 或通過主從切換來整理小于 1 說明發(fā)生了 swapRedis 開始用磁盤性能會斷崖式下跌。第三個是 OBJECT ENCODING key查編碼是否符合預(yù)期。這三個命令組合起來一個 key 大約 10 秒內(nèi)就能完成內(nèi)存占用、碎片情況、編碼狀態(tài)的全面體檢。8.4 連接數(shù)打滿與命令超時的排查鏈路還有一次業(yè)務(wù)反饋所有接口都變慢我排查后發(fā)現(xiàn) Redis 連接數(shù)暴漲。連接數(shù)打滿的常見原因有幾個服務(wù)端連接池配置過大、客戶端沒有正確歸還連接、慢查詢導(dǎo)致單個連接占用時間過長、空閑連接沒有及時回收。這些原因的排查順序我從實際經(jīng)驗里總結(jié)成一條鏈路先看 deferred 和 rejected 連接數(shù)再用 CLIENT LIST 看連接來源分布再用 SLOWLOG 慢日志看是否有慢命令最后看客戶端連接池的 maxTotal 和 maxIdle 配置。這里特別提一個容易被忽略的點很多客戶端連接池的最大連接數(shù)默認值是大幾千但 Redis 服務(wù)端默認 maxclients 只有 10000。當(dāng)服務(wù)實例多、每個實例又用盡連接池時很容易打滿。解決辦法是統(tǒng)一規(guī)劃連接池大小建議每個服務(wù)實例的連接數(shù)控制在幾百以內(nèi)并在客戶端配置合理的 minIdle 和 maxIdle避免連接被無意義地占用。另一個維度是給所有 Redis 命令設(shè)置合理的超時時間——連接超時設(shè) 200ms讀超時設(shè) 500ms一旦超時立即熔斷降級而不是無限等待把故障的影響控制在調(diào)用方。9. 寫給新手的幾條實戰(zhàn)心法9.1 先畫數(shù)據(jù)模型再寫命令我見過很多新人一上來就敲命令敲著敲著發(fā)現(xiàn)類型選錯了又要重構(gòu)。正確順序是先畫出業(yè)務(wù)數(shù)據(jù)模型——哪些是單值、哪些是對象、哪些是列表、哪些是集合、哪些需要排序然后對著五大類型做映射。這個過程不花 10 分鐘但能省下一天的重構(gòu)時間。畫數(shù)據(jù)模型時我的習(xí)慣是隨手寫一個數(shù)據(jù)字典格式很簡單key: user:1001 類型: Hash field: name / age / city / reg_time 用途: 用戶詳情緩存按字段讀取 TTL: 1 小時每個 key 都按這個格式在項目文檔里登記維護成本非常低但團隊協(xié)作時能避免很多這個 key 到底存的啥的口頭溝通。9.2 一套命令走天下還是按需組合Redis 的命令看起來多但常用的命令其實就是二十來個。我對新手的建議是別試圖背全命令但要把核心組合用熟。單值緩存組合SET GET DEL SETNX SETEX EXPIRE對象緩存組合HSET HGET HGETALL HDEL HINCRBY列表組合LPUSH RPOP LRANGE LTRIM LLEN集合組合SADD SREM SISMEMBER SINTER SPOP有序集合組合ZADD ZINCRBY ZRANGE ZREVRANGE ZRANGEBYSCORE每個組合都有自己的慣用法比如LPUSH LTRIM 做最新列表ZADD ZREVRANGE 做排行榜SADD 返回值做去重判斷。把慣用法記熟再配合 SCAN、OBJECT、MEMORY 等運維命令基本就能應(yīng)對 95% 的開發(fā)場景。9.3 養(yǎng)成三個好習(xí)慣TTL、命名規(guī)范、監(jiān)控最后聊聊習(xí)慣技術(shù)選型再對習(xí)慣不好也會翻車。我總結(jié)成三條缺一不可。第一能設(shè) TTL 一定要設(shè) TTL。緩存型數(shù)據(jù)如果忘了設(shè)過期時間一旦數(shù)據(jù)源變化Redis 里的舊數(shù)據(jù)就會一直存在成為僵尸緩存。我見過一個項目所有 key 都沒設(shè)置過期時間后來數(shù)據(jù)不一致了排查了一星期最后發(fā)現(xiàn)是緩存沒失效。所有能設(shè) TTL 的 key都應(yīng)該設(shè) TTL哪怕只是 10 分鐘。第二key 命名要有統(tǒng)一規(guī)范。一個可讀的命名體系能讓你在排障時不用憑空猜。我常用的規(guī)范是業(yè)務(wù)域:實體:ID:屬性例如 user:1001:profile:name。這種命名方式的好處是可以通過前綴用 SCAN 掃描出某個業(yè)務(wù)域的所有 key監(jiān)控平臺也能按前綴聚合統(tǒng)計。但注意千萬不要用 KEYS 命令去掃生產(chǎn)環(huán)境要用 SCAN。第三監(jiān)控必須前置。至少要有三個指標(biāo)命中率hit_rate、內(nèi)存使用率、慢查詢數(shù)。命中率低了說明緩存設(shè)計有問題內(nèi)存漲了要提前擴容慢查詢多了要立刻排查。對接 Prometheus 加 Grafana 的 redis_exporter 是社區(qū)標(biāo)配上線前就接好別等出了事故再裝。這三個習(xí)慣是零成本高回報的典型。很多人把注意力放在選型和命令上卻忽視了這些基礎(chǔ)工程能力最終在真實故障里付出代價??梢哉fRedis 用得好不好一大半取決于這三點有沒有做到。我自己的體會是把這五種類型全部用熟只是第一層真正的高手會把它們當(dāng)作樂高積木一樣自然地組合用 String 存令牌、用 Hash 存對象、用 List 做時間線、用 Set 做去重、用 ZSet 做排序然后在更復(fù)雜的場景里疊加 Stream、HyperLogLog 這些進階結(jié)構(gòu)。掌握每個結(jié)構(gòu)最擅長解決的那個問題比死記一百條命令有用得多。最后再分享一個小技巧遇到不確定該用哪種類型的方案先在命令行里用真實數(shù)據(jù)規(guī)模的小樣本跑一遍觀察內(nèi)存和耗時表現(xiàn)再做決定。這種先試驗后落地的習(xí)慣能幫你避免很多以為能用、一上線就出問題的大型返工。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美在线播放| 长久操视频| 日本在线观看网址| 91nbbbbbb| 精品亚洲国产成人AV制服丝袜| 国内一级精品| 97超碰巨乳| 综合色图区| 欧美亚洲国产91在线| 一区e区三| 日本精品免费一区二区三区四区| 天堂蜜桃无码视频一区二区| 巨爆乳肉感一区二区三区竹菊影视| 九九九九久久久久| 久久久久女教师免费一区| 国厂麻豆77q4| 超碰在线1234区| 日韩精品99久久久久久中文字幕 | 蜜桃久久一区| 狠狠爱夜夜干| 欧美 日韩 另类 亚洲| 人人考人人摸人人干| 免费岛国一级片| 欧美91网| 超碰久久综合| 91久久18禁| 国产成人亚洲精品自产在线| 在线另类| www久久久| 亚洲好看强奸乱伦| 日本成人A片网站| 中文乱码字幕观看| 97干97色| 欧美色女人| 男人的天堂VA| 屁股久久久久久| 欧美综合第一页| 人妻喷水| 中精品一区二区三区| 丝袜美腿射精91| 青青欧洲黑| 中文字幕久久亚州无码| 九九九精品一区二区无码| 九九久久国产精品| 性欧美精| 98久久超碰| 亚洲美腿丝袜香蕉影视欧美成人| 少妇特黄一区二区三区| 日日操夜夜操天天操免费观看麻豆| 亚州精品人妻一二三区| 青青草原香蕉日本Ap| 久色99999| 欧美在线中M| 国产精品久久久久久夜夜夜夜| 成人热久久精品| 久久久九九| 久操视频在线| 98超碰欧美| 久夜视频| 日本一区视频在线观看| 人妻人人操| 日本99热| 美美91成人国产精品欧美精品久久久久久久 | 狠狠操狠狠爱| 东北黄色电影| 97超碰中文| 怡红院亚洲怡春院av| 超碰九九| 91精品女厕偷拍视频| 91成人在线免费视频| 日本欧美国内在线| 嗯嗯,好大,好爽,好骚| 试看福利| 日韩超碰97| 91美女网站| WWW操逼| 在线免费观看高清无码视频| 亚洲精品毛片在线观看| 亚洲超碰在线| 91夜夜蜜桃臀1区2区3区| 亚洲情色无码一区二区三区| 高清有码一区二区| 日本精品不卡一二三区| 亚洲欲| 久久东京热成人| 欧美亚洲一级在线观看| 凹凸视频特色日本特黄| 熟女AV一区| 九九九九精品精| 亚洲熟妇一,二,三期| 免费A V在线播放| 啊啊啊啊嗯嗯嗯用力好爽| 日韩三级网址| 久操免费观看| 国产三级多多影院2022国产AA一级毛片无码| 怡红院一区二区熟女人妻| 亚洲国产欧美日韩精品一区二区三区,国产一区二区三区在线看片,欧美性猛交 XXX | 大色综合| 激情五月天丁香社区| 偷拍 精品另类 凸凹了四区| 是还免费视频1727我| 久肏视频字幕| 91强热人妻| 麻豆性爱视频在线播放| 加勒比中文av| 日韩无码成人电影| 噜噜噜亚洲精| 人人妻人射| 欧美熟爽综合| 久久中文字幕在线观看| 狠狠激情综合狠狠操中文字幕| 国产农村妇女精品一| 亚洲双插| 国产极品99热在线播放69| 亚洲精品久久久久久久久豆丁网| 蜜桃天美传媒AV一区二区三区| 探花视频免费观看国产专区| 亚洲色色色| 青久久| 妇女性内射冈站HDWWWCOM| 无码伊人久久大杳蕉中文无码| 一区 欧美 日韩 麻豆| 91热热色| 亚洲 日韩 欧美 国产综合体| 欧日韩一二三f区| 少妇3P性爱自拍| 亚洲AV资源| 屁股久久久久久久| 99热精品国产| 精品一区二区在线针对华人免费观看这里只有精品免费观看 | 色综合久久夜色精品国产天堂| 思思热一热婷婷热一热| 淫淫综合网| 人人爱操| 夜夜嗨视频| 精品久久視頻在线| 8x福利精品第一福利视频导航| 日韩99神马视频播放片在线播放| 天天干人人干天天日97| 午夜福利一区二区三区四区五区色婷婷| 操逼www.| 亚洲精品九九九| 色婷婷电影网| 波多野结衣之双飞调教在线播放 | 97久久久网站| 亚洲情色一区综合| 久久久无码av精| 少妇人妻在线| 大香蕉操久久| 无码精品久久久天天影视| 人妻酒店出差被中出免费在线播放| 亚洲欧洲综合av在线| 人人爱夜夜爱| 人人干人人搞人人摸| 老色鬼成人精品视频下载大在线观看| 精品女人999| 成人线上超碰| 人妻少妇精品久久久| 免费精品福利在线观看| 东京热男人的天堂| 嗯嗯啊啊日韩精品| 丁香五月偷拍| 国产乱伦亚洲色图高清无码| 蜜臀无码一区二区| 亚州成人a∨| 精品中文字幕第一页| 激情视频图片| 国产盗摄美女如厕大神作品在线观看| 色小视频蜜乳| 欧美日产国产在线成人第一区| 国产精品久久久久久9999| 久久久com| 蜜臀久久99精品久久久| 婷婷九月丁香| 国产丝袜美腿美女麻豆| 99综合视频| 免费久久一级毛片大黄| 国产97亚洲| 日韩中文字幕宗合在线| 美女人妻色网站| 强奸a片网| 欧美日韩在线视频网站| 欧美日韩系列| jiujiujiujingpin| 草b在线| 日本色色的视频| 操国产逼| 久久久久久久97| 国产又长又大又粗的视频| 9热9热综合网| 男人的天堂.com| 99热这里只有精| 欧美性爱中文字幕无线码| 国产一区在线播放| 草草草草视频| 中文字幕99999| 91高清日| 高清孕妇孕交 交孕妇| 91夜色chaopeng| 2010男人的天堂| 人人操人人狠狠操| 99成人| 在线观看日韩av不卡| 日韩人妻一二三区视频| 一级成人性爱| 国产视频一区二区三区在线免费观看| 中文字幕欧美日韩三级| 亚洲狠| 大色网久久| 亚洲性猛交| oumeisetupian| 日韩三级一区| 性爱动态120秒| 99热这里只有精品9| 在线人人人人人人精品超| 国产高清成人mv在线观看| 九九精品无码专区免费| 亚洲av国产av综合av卡| 国产麻豆福利av在线播放| 日韩免费看在线黄色片| 日本女优在线视频福利| 日韩美脚一区二区网站| 久久久影院| 2019AV天堂| 人妻一区久久二区三区色播| 91国产大片| 亚射在线| 熟妇精品juliaannAV| 欧美一区二区成人一卡| 亚洲日韩欧美一区二区| 久操视频在线| 久久久久久九九九九| 精品无码久久久久久久久果冻糖心| 熟妇色99| 中字幕人妻一区二区三区| 国产精品视频自拍在线| 亚洲国产婷婷在线播放| 国产精品自在自拍视频| 五月天色图影视| 青青草原人妻| 清纯唯美综合| 欧美爆乳精品一区二区| 99久久e免费热视| 欧美在线观看综合国产| 夂久色| 又摸又舔在线观看网站| 欧美熟妇色| 乱伦一二三| 国产精品无码久久久久2025| 九九久久99| WWW4虎| 欧美中字不卡| 91丝袜视频在线观看| 黄色香蕉视频网站一区| 97人人操人人干| 天天干一区二区| 另类欧美| 国产精品一区av在线| 思思热免费视频观看| 亚州色交| 欧美草草高清日韩视频| 岛国1区2区3区在线观看| 免费A V在线播放| 粉嫩国产精品久久粉嫩| 97国产伦理| 色噜噜国产精品视频一区二区| 亚洲免费成人在线高清无码视频 | 少妇蹲下露出大唇5| 男女性感激情网站| 91 国产丝袜在线放观看 | 欧美黄片免费在线观看视频| 99自拍B亚洲 | 五月丁香黄色网| 九九综合久久| 欧美日韩天堂| 999精品国产高清一区二区| 亚洲精品视频在线| 中文字幕av片| 91爆操视频| 啊啊啊快操我视频| 可以免费看黄片的视频| 日韩草久视频| 亚洲人妻精品一区二区| 亚洲成人综合在线| 99re黄| 亚洲图片欧洲图片aⅴ| 超碰97在线 欧美 国产| 四虎精品永久在线播放| 最新加勒比丝袜在线| 加勒比av网| 国产精品美女在线一区| 亚洲图片 激情小说| 欧美一区二区三区不卡高清视频| 久久精品人体AV| 亚洲高清91| 国产情侣自拍在线播放| 啊啊啊啊啊舒服| 久久精品店| 日韩精品一二三四| 欧美日韩亚洲少妇寂寞影院正在播放 | 手机av亚洲丝袜美腿日韩第一页二页| 一级片在线观看高清无码| 欧美香蕉视xxx| 四虎在线观看视频| 日韩操逼性鲍| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 欧美写真视频一区| 特污免视频| 日本一二区不卡| 97干在线看| 成年人黄色视频免费| 宅男91视频在线播放| 精品视频在线观看精品| 欧美激情片一区二区| 东京热视频网| 97超碰人操| 久热香蕉精品在线视频| 欧美另类天堂| 国产在线76页| 成人性爱AV在线免费观看| 中文字幕一区二区三区蜜臀| 风流老熟女一区二区三区l| 9.1小视频| 青青草视频久久| 欧美一级AAAAAAA| 国产青视频| 国产懂色精品国产av| 91制服丝袜| 中文字幕精品丝袜| 无码视频黄色网战| 国产精品美女久久久久久网站| 九一综合精品视品av| 青青伊人这里只有精品| 大色网久久| 偷窥自拍亚洲色图| 粉嫩不卡一区二区性爱| 精品国产91内射久久| 亚洲影视高清第一页| 熟妇在线视频一区二区| 91丨九色丨国产丨人妻在线| 色哟哟av| 你草精品在线视频| 台湾佬激情综合| 91精品久久久久五月天精品| 麻豆一区二区AV天美| 无码91| www.99中文字幕| 欧美伊人电影| 欧美日韩人妻婷婷一区| 国产性感在线观看| 五月天婷婷综合网| 日韩Va亚洲va欧美Ⅴa久久| 欧美九九九| 日本男人插女人的逼黄色| 欧美日韩99| 日韩欧美午夜一区二区| 99re黄| 久久鲁夜| 熟女一区二区| 免费看一级a性色生活片久久无| 综合网亚洲| 亚洲蜜臀精品视频久久| 精品人妻一区二区三区视频| 又粗又长又大国产不卡| 欧美中日韩XXXX| 亚洲s色图| 97色欧州| 青娱乐导航AV| 亚洲国产精品久久久久婷婷青年| 激情久久久| 3028国产精品| 久久这里是精品| 人人操人人操人人操人人操人人操人人人11.CM | 2017大香蕉国产精品久久| 国内91熟女人妻丝袜天天精品视频在线 | 亚洲美女av无码| 91免费看中出视频| 天天影视91看看| 一区二区三区在线日韩影院观看| 久久中文字幕女同性恋一区| 日日干夜夜骑| 久艹99| 97超碰中文字幕| 极品后入免费视频| 国产和美国毛片| 免费成人在线熟妇网| 国产精品。| 嗯嗯,好大,好爽,好骚 | 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 97精品久久| 欧美亚洲小说| 国产精品成人AV片免费看网站| 香蕉综合网| 亚洲色图一区二区三区| 亚洲婷婷综合网| 一级片视频啪啪| 日本人妻伦在线中文字幕| 色色毛片| 青娱乐久久艹| 殴美,日韩国产伦精品| 亚洲天堂人妻一区二区| 亚洲射综合网| 天欧美在线| 色路综合| 97精品国产| 中文字幕乱码在线| 91在线免费精品视频| 国产av激情无码久久天堂| 国产精品分类在线观看| 色综合久久av| 九九aV| 中文字幕一区日韩精| 丝袜美腿制服人妻二区中文字幕| 色色色色网站| 狠狠中文字幕| 久久偷拍人| 黑人精品久久97| 肉嘟嘟www视频在线观看高清| 亚洲精品三区在线观看| 日韩av在线免费网站| 国内自拍 日韩激情 99| 九九九久千久久激情蜜桃在线看| 亚洲欧美九九九| 成人在线视频一区| 中文字幕乱亚洲美女精品一区| 蜜臀久久99精品久久久久| 97精品久久| 欧美日韩日产免费网站看| 亚洲欧洲国产综合av| 人人人人人人少妇| 国内97干免费看| 午夜爽爽爽| 久久这里只精品免费福利| www.91理论| 五月丁香| 国偷自 一区| 91美女视频。| 爱妃国产亚洲视频中文字幕| 久久鲁干| 欧州激情视频在线一区二区| 国产精品69久久久久孕妇欧美| 91精品国产一区三一| 天天操天天干一区二区| 天天干天天爽| 丝袜美腿校园春色| 亚洲精品国产日韩无码AV永久免| 国产在线精品偷| 少妇免费视频| 美女高潮国产高清| 在线欧美69V免费观看视频| 成人五月香网在线| 色九色久| 91强热人妻| 99青草| 亚洲 综合 第一页| www.91人妻.com| 操碰97| 亚洲熟女乱色一区二区三区| 天美AV片| 9997se| 亚洲无码超碰免费| 五月激情天| 日日躁狠狠躁天天躁精品| 五月丁香六月综合缴清无码| 99热超碰| 2024年最新色情网站在线观看 | 亚洲91大片| 2024黄色视频| 激激五月| 精品一区二区久久| 人人摸.人人色| 啊啊啊操一区| 欧美在线啊啊| 日韩三级一区 | 色婷婷99| 亚洲精品国产熟女| 中文字幕精品探花视频| 日韩日本欧美在线观看| 日本色色色视频| 久婷婷一区| 蜜臀99久久精品久久久懂爱| 久久久久久精品免费看A级| 亚洲妇色| 日韩一级欧美一级国产一级台湾| 免费簧片在线观看| 夜夜嗨av午夜成人| 欧美日韩在线视频网站| 欧美色棕合| 久久精品操| 91精品久久久久久综合五月天| 日本久久久精品电影| 国产精品呦一区二区三区| 少妇天堂网络| 91原创在线观看| 亚洲天堂AV在线播放| 久操com| 91狠狠综合久久| 亚洲偷91色| 在线视频免费播放一区| 啊啊啊在线看| 亚州精人品大香蕉| 国产中文字幕在线| 色五月首页| 丁香六月啪啪| 加勒比色综合| 中文字幕第23区| 人人做,人人操,人人摸| 久综合网| 狠狠综合| 熟女在线视频| 日日夜夜骚| 红桃视频高潮| 免费97视频| 欧美三级免费伊人| 色色色日本| 日本蜜桃| 3571色综合一区二区二区| 色吧 综合| 亚洲性猛| 久久一区,青青青青草视频在线播放| 五十路人妻在线| 91xingse| 婷色五月| 亚洲强奸乱伦影视网| 精品天堂| 亚洲第一男人天堂| 亚洲精品蜜桃久久久久久久| 99热这里只有精| 国产操偷| 国产欧美亚洲精品a第2页| 日本综合久久| 日本 欧美 国产一区| 黄在线| 囯产精品久久久久久久久久梁医生| 午夜经典| 亚洲国产97在线精品一区| 日韩噜噜69| 久久久蜜桃一区二区三区| 日本操BAV| 国模精品娜娜一二三区| 凹凸久久人人| 国产色综合亚洲色综合吹潮| 超碰在线观看av不卡| 色超碰综合| 92午夜免费福利视频| 欧美 亚洲 偷拍自拍| 欧洲熟妇xxXx欧美老妇裸体| 狠狠操夜夜操蜜桃视频三区| 男人的天堂久久狠| 亚洲强奸乱伦影视网| 99热| 丝袜美腿制服人妻二区中文字幕 | 国产精品自拍视频 | 国产操逼逼网| www亚洲免费| 四虎在线观看视频| 精品少妇一区二区| 欧亚综合一卡二卡中文字幕| 免费看毛片操穴| 午夜理论片在线观看免费| 久久日韩精品一区二区| 91AV入口| 91人妻在线视频| 国产丁香精品露脸视频| 变态另类专区| 91天天综合在线观看| 伊人操操| 小草av不卡亚洲二区| 爱欲AV| 你操综合| 在线 亚洲 网爆 自拍| 人夜夜精品网站香蕉嫩草| 成人福利视频网| 三级片网站在线播放| 福利色色| 亚洲无码久久久久久久| 亚洲最新中文字幕免费| 日本三级一区二区 在线| 偷拍三区| 电家庭影院午夜69久久夜色精品国产69乱 | 国语国产操逼伊人AV网| 国产高清26uuu| 激情抓乳插进去啪啪啪日韩 | 夜夜一区二区| 五月天伊人| 冬京热男人的天堂| 天天摸天天碰天天添青青| 亚洲精品一二三四区| 97国产天堂岛| 道久久五香丁月婷婷激情综合| 精品国产国产AV| 久热精品在线| 久久精品超碰| 国产福利一区二| 午夜激情成人在线观看| 色色福利| 日韩偷拍色图| 色狠人在线99| 老熟女中文字幕高清| 麻豆尤物视频网| 91爱| 免费看片黄| 精品一区二区人妖| 亚洲色图久久成人| 欧美97在线观看| 久久9精品网站| 精品人妻一区二区三区视频在线| 呦呦一区| 伊人色综合网电影| 人妻夜夜爽天天爽麻豆三区网站| 91夜夜蜜桃臀1区2区3区| 欧美激情黑人| 亚洲欧美综合| 亚洲黄色a级片| 亚洲s在线观看| 久日综合网| 欧美在线天堂| 午夜精品久久久久久久99蜜桃一| 国语人妻精彩刺激| 亚洲第91页 | 静品嫩模一区二区| 亚州春色| 国产欧美另类久久久精品课程| 2019天天干| 亚洲AV无码国产精品久久久久 | 热99这里有精品综合久久 | 超碰在线974| 性饥渴少妇av无码毛片| 极品白嫩美女白浆成人福利在线看| 麻豆九九九| 欧洲亚洲人妻无码久久三区四区| 中文字幕,人妻,日韩| 久久秀这里有精品| 色偷偷超碰亚洲| 欧美色www亚洲国产阿娇要播| 操婷婷逼| 不卡人妻少妇精品毛片一区23区视频| 加勒比性爱成人在线| 超碰欧美| 色色热| 国产一区二区三区久久精品太古里| 欧美裸体美女日麻屄| 92午夜免费福利视频| 伊人一区二区三区| 日韩中文字幕视频| 色噜噜人妻av 中文字幕| 国产精品一区在线播放| 在线观看日韩av不卡| 熟女一区二区三区| 亚洲欧美另类激情小说| 色五月激情网| 国产97/欧美| 十八禁啪啦拍视频无遮挡| 60秒免费小视频| 在线αⅴ| 四虎免费看黄| WWW.操逼.COM| 五月久久HDAV| 久久亚洲国产成人| 亚洲丝袜天堂| 天天综合网91| 超碰超碰欧美| 2017av无码免费无线播| 91亚州欧美| 国产丝袜欧美在线视频| 亚洲国成人情色好看电影| 欧洲欧美视频一区二区| 国产丝袜美腿美女麻豆| 另类图片综合| 天美欧美国产| 国产综合永久精品日韩鬼片| 精品女同一区二区三区| 色五月网址| 男人的天堂com| 欧美日韩国产中文精品字幕自在自线, | 99久久精品无码一区二区毛片免费| 99re8超碰| 久久久精品91八戒| 麻豆区久久久久亚| 久久欧美性爱视频| 综合亚洲欧美| 亚洲AV高潮| 日韩无码三级影院| 97超碰人操| 五月综合视频| 国产在线观看一区二区三区| 欧美色图人妻| 欧美做爰无码A片视频| 亚洲男人天堂网站| 久久国模av| 激情小说成人日本无码一| 加勒比色综合| 丝袜美腿欧美| 国产高清精品一区二区三区毛片 | 日韩一级久久毛片| 91视频综合在线| 亚洲天堂性爱| 大香蕉黄色一级片免费看| 欧美天天综合站| 无码91| 一级特黄aaa大片在线观看成人一级片在线观看 | 亚洲中文日韩精品| 高清有码一区二区| 99超碰网| 亚洲国成人情色好看电影| 女人爽到高潮潮喷18禁网站| 中文字幕在线免费观看| 黄总AV色图| 人人干人人搞人人摸| 97干在线视频| 亚州大图综合色图| 亚洲人精品久久久喷水| 国产第25页在线观看| 欧美色综合| 日韩大香蕉精品在线视频| 顶级少妇BT天堂| 强奸乱伦麻豆| 丁香婷婷五月| 天天伊人| 亚欧美色图| 欲香欲色天天天综合和网| 91丨九色丨国产打屁股| 八戒午夜福利理论片| 碰碰97| 国产版a级片直播在线| 亚洲熟女av中文字幕| 97AV在线免费观看| 最新亚洲风情电影| 伊人综合色网| 激情网五月天| 亚洲国产午夜真人一级片中文字幕精品黄网站 | 91碰碰| 久久99精品九九久久久婷婷| 一区二区偷拍拍视频| 青青操综合网| 国产丝袜欧美在线视频| 老熟妇乱轮| 一区二区影视| 久久岛国| 热G综合热G中文| 91在线丝袜| 欧美91精彩| 国产专区路线| 欧美日韩亚洲天堂网| 亚洲中文人妻色| 91红杏| 天天综合网国产| 美女黄频a美女大全免费皮| 东京热男人的天堂精品| 嫩草美女久久| 欧美经典一区二区三区| 91搞逼视频| 成人av性爱电影在线观看| 51国产午夜精品视频| 欧美极品| 亚洲AV麻豆Aⅴ无码电影一| 91日韩国产欧美亚洲另类精盘州至城都| 少妇色综合| 欧美天天综合站| 嗯,啊。舔我逼| 天天日日本| 久草毛片电影怡| 91美女看B| 加勒比人妻综合| 在线洲亚线| 青草地一本线一区二区三区| 日本韩高清无砖码22o| 日本成人在线不卡一区二区三区| 大学生美女口爆| av网站在线看| 国产精品久久天天干| 国产91乱伦| 蜜乳AV色欲AVAV无码| 国产精品一区人妻精品阁在线| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 亚洲国产91精品一区二区久久| yellow网站免费观看日韩高清无码| 精品人妻一区二区视频| 国产精品久久久久久 百度| 亚洲色久| 婷婷三区| SS久久| 欧美日动态视频| 亚州欧美另类| 91精片| 久久东京热久久| 国产一区二区在线播放量| A 在线网址| 婷婷五月天影院| 高树玛利亚无码流出| 熟妇无码视频三区| 女性91网站| 飘花国产午夜精品不卡| 精品人妻伦一二三区久久| 四虎影视在线| 久久99干一本高清| 国产操逼网站亚洲一级黄色| 亚洲精品乱码久久久久久蜜桃麻豆| 九九热精品| 97自拍一区| 亚洲国产熟妇综合色专区| 国产最火爆久久国产网站网站| 91久久久久久久久18| 蜜臀av中字字幕网站| 好湿好紧视频| 色哟哟AⅤ| 波多野42部无码喷潮在线观看 | 日韩精品系列| 久久这里只精品免费福利| 欧美日韩中文亚洲v在线综合| 天美国产三级传媒| 五月天亚洲网| 激情五月综合开心五月| 鲁鲁色综合网| 俺也射| 乱伦色图网址是多少| 亚洲色欲天天人妻无码系列专区| 高潮综合网| 天天做天天爱| 久久精品国产72国产精品福利| 天美精品一区二区三区四区在线观看| 日韩三级av片| 亚欧高清v| 夜精品久无码| 天天色黄色影院天天操| 91亚洲人电影| 中文乱码字幕观看| 日本中文字幕在线视频 | 久欲AV| 成人a大片在线观看| 九九玖玖精品| 屁股久久久久久| 亚洲丝袜二区| 亚洲欧美首页| 看日韩美女二区三区免费操逼视频| 热G综合热G中文| 国产在线视视频有精品| 麻豆 亚洲 97| 熟女少妇视频| 天天爽夜夜操| 日韩综合色图| 丁香五月综合| 大香蕉久久| 麻豆人妻精品一区二区| 欧美成人国产精品| 亚洲av综合色区无码一| 亚洲第91页 | 人妻熟女一区二区三区在线| 91成人高清在线观看| 淫淫总合网| 午夜啪| 久久国产视频性吧| 亚洲色欧美| 人妻在线臀日韩| 亚洲密乳AV| 国产偷仑| av最新免费中文字幕| 少妇内射www在线观看视频| 性饥渴少妇av无码毛片| 一区| 国产精品亚洲一级av第二区| 亚洲欧美日韩电影网站一区| 乳欲人妻办公室奶水| 天天色踪合| 无码聚合| 精品无人区麻豆乱码1区2区图片| 五月天综合网| 麻豆亚洲AV成人无码久久精品| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲文学偷乱拍啪啪啪啪| www.99中文字幕| 9九九国产| av大香蕉| 日韩性爱视频在线免费观看| 欧美页片| 日韩女模中文造逼| 97色操| 欧美日韩中文字幕人妻| 九九这里只有精品| 国产精品不卡一区二区三区av| 午夜欧美神马久久久久| 日本污ww视频网站| 蜜臀久久99精品久久久久久-DVD| 玖玖婷婷五月天| 日本一区二区亚洲综合| 久久综合超碰| 小少妇| 亚洲一区日韩精品中文字幕| 91久久国外网| 五月天伊人| 秋霞久久亚洲精品成人| 国产一区二区在线看| 黄色高清久久无码依人| 蜜臀AV网站| 日本人妻中文字幕精品| 国产午夜福利合集| 密臀AV在线| 久久久五月天| 岛国毛片手机在线观看| 天美麻豆一区二区三区| 强奸熟女一区二区三区| 日韩一区二区精品视频| 亚洲欧美国产成人综合不卡| 中文字幕乱妇免费视频| 久久大香蕉手机高清| 91久久精品中文字幕| 综合网亚洲1| 五月天久久婷婷亚洲 | 久日综合网| 亚洲日韩AV视色| 亚洲精品国产精品乱码不99| 国产精品自拍视频| 97超级久久| 麻豆国产成人精品| 青苹果影院男人的天堂| 天天看,天天做| 欧美十八禁导航成人| 亚洲日韩精品一区二区| 四虎精品一区| 综合 青草 伊久久 影院 综合| 99色热| 亚洲一级性爱视频免费看| 全国男人天堂网| yazhousetuoumei| 欧美,日韩,亚洲视频| 岛国免费黄色网址| 欧美亚洲首页| 久久日韩肥臀| 嗯……啊…嗯嗯…啊…好舒服| 天天色粽合合合合合合合| 亚洲色图尤物视频| 无码高清少妇久久| 日日骚AV| 国产高清成人免费视频| 大香蕉啪啪啪啪在线| 熟女中出视频| 99久久9| 人人操人人狠狠操| 搡老女人老91妇女老熟女| 亚洲人妻精品一区二区| 婷婷探花久久精品一区| 性生活性生大爱77AV国产| 成熟熟女国产精品一区二区| 久久同城AV| 亚洲国男人的天堂| 麻豆天美国美国产| 91亚洲图片| 98久久超碰| 欧美东京热青青草| 久久中出| 嗯嗯嗯啊啊在线观看| 色香伊人| 国产深喉| 久超碰这里只有精品| 97鸡把在线视频| 天天欧美| 精品无码欧美三级| 97国产精品视频| 欧美A片中文字幕| 亚洲av国产av综合av卡| 午夜啪啪片| 久久午夜鲁丝片| 精品一区二区综合熟妇| 91一起操| 日韩中文字幕二区| 97久久精品亚洲| 五月天激情婷婷| 亚洲AV无码| 久久曰曰| 精品无码一区二区人妻久久蜜桃| 91爱做| 自拍第一页| 欧美最大综合网| 中文乱码字幕观看视频| 婷婷爽人人婷婷爽视频| 八戒午夜福利理论片| 国产精品久久久久久照片| 国产视频一区二区免费| 色欲天天综合网| 亚洲情色一区综合| 农村妇女精品一区二区| 99草精| 天天影视综合色| 黑人娇小av在线播放| 夜夜草天天| 不卡一区二区日本视频| 韩国久久97| 美女黄码视频午夜| 男人在线天堂| 人人操人人大香蕉| 久久的网站啊啊啊啊啊| 97超碰中文字幕| 97无码视频在线播放| 人人射人人操人人摸| 超碰在线974| 精品国产乱码久久久久久久| 午夜福利一区二区影院| 色噜噜人妻丝袜a∨先锋影| 超碰国产情侣自拍网| 99999这里都精品| 国产日韩精品suv| 国产一区自拍欧美日韩| 亚洲人妻一区二区三区| 久9爱经典视频| av中亚| 日韩精品在线观看网站| 精品一区二区三区蜜桃臀赵总| 人妻 欧美 中文| 中文字幕一区二区无码成人| 成人aⅴ一区二区三区| 男人的天堂2019AV| 成人开心网在线视频| 亚洲天堂精品日韩电影| 超碰人人在线| 日韩专区久久久| 看免费一级在线播放毛片| 99性爱| 精品无码一二三四区| 欧美成人一级麻豆| 偷窥自拍亚洲天堂网爆| 欧美天堂亚洲电影院一区在线播放| 中文字幕av一区二区三区人妻少妇| 日韩免费看在线黄色片| 第二页中文字幕| 超碰色97| 久久婷婷亚洲| 日韩午夜国产| 天天视频黄| 俺去也婷婷| 亚洲天天综合| 日韩精品一区二区三区四虎影视| 91大神电影天堂| 91亚洲电影| 亚洲欧美日韩夜夜| 亚洲综合色在线| 国产精品女久久久久av爽| 欧美一区二区在线资源| 国产成人欧美精品在线| 激情av| 色偷综合| 91久久九九精品国产综合| 国产欧美美女免费观看视频| 久久久熟女一区| 国产精品人人爽人人做可爱福利| 视频国产欧美在线播放| 久久久com| 成年在线视频日本亚洲在线视频区精品江靖宇公司 | 91强奸乱轮| 97超级色碰碰| 欧美日韩在线国产在线| 99精品丰满人妻无码| JULIA一区二区三区在线播放| 97bbn| 26uuu国产成人综合| 日韩不卡码| 黄片免费看的| 伊人青青一区成人视频在线观看区| 成人五月天丁香激情综合| 91网亚洲| 国产精品嫩草影院午夜两性| 国产精品欧美激在线| 超清福利精品视频在线| 很很很很操| 亚洲九月丁香| 激情文学亚洲| 超碰日本97美女人妻人人玩人人爱| 麻豆成人AV| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚热日本熟女| 色黄色美女大长腿午夜视频| 亚洲色天堂九9| 爱爱60秒免费视频| 色婷婷国产精品一区在线观看| 少妇同性| 欧美日韩日产免费网站看| 天天躁夜夜躁狠狠躁AV| 日韩精品人妻一| 欧美日韩色| 欧美 青青草| 色就色综合| 天天躁日日躁狠狠狠躁| 中文字幕日本久久| 久久久新亚洲AV| 国产视频第2页| 一区二区娱乐网站| 看日韩黄片| 精品99999久久久久久| 在线观看岛国有码| 久久久久夜夜夜夜| 97日视频| 激情综合网激情五月天| 日韩天天综合| 蜜臀AV成人精品蜜臀AV久久| 精品人妻一区二区三区日产| 日本2020一区二区| 91狠狠色丁香婷婷综合久久精品| 亚洲一区日韩精品中文字幕| 偷拍综合亚洲| 日本综合久久| 亚洲一曲日韩精品| 后入精品| 美女AV一区二区| 色五月网址| 偷拍亚洲熟女视频播放| 国产精品乱码久久久久| 91黑丝露脚| 亚洲精品第一| 国产美女口爆吞精视频| 蜜臀在线网站| 蜜桃久久精品一区二区三区| 国产精品香蕉热久久新品| 婷婷午夜清品久久久久久久性色视频观| 91激情网| 97在线欧| 精品久久99| 思思99热| 377p欧洲日本亚洲大胆| 国产成年女黄特黄| 色97综合中文字幕| 欧美午夜视频| 91国产大片| 99re视频在线观看这里只有精品| 黄片aaaaa一区| 天天综合网~91| 97色欧洲| 蜜臀一二三区| 久久久久9久久久久| www.夜夜| 国内精品久久久久影院亚洲| 国产乱伦视频污| 黑人综合网| 99在线观看视频在线高清| 欧美手机在线综合| 久久久久久少妇| 天天弄欧美| 第四色色综合91| 67194无码不卡| 久热这里| 五月婷婷综合网| 久草精品国产99| 欧洲性爱无码区| 亚洲国产另类在线中文| 欧美 亚洲精品首页| 精品美女少妇一区二区| 天天操福利视频综合网站| 狠色婷婷久久一区二区三区_| 久久久久久久久久久久黄色 | 亚洲欧洲无码97久久精品| 亚洲宗合电影| 青草青青久久久久久国产| 日本熟妇熟色97一本在线观看| 大香蕉97久久| 五月天开心网| 婷婷久草一区二区三区| 中文字幕二区日韩天堂| 伊人AAA| 麻豆人妻精品一区二区| 国产精品视频白浆免费| 黄色av片三级三级三级免费看| 日韩精品亚洲专区在线影视|