Redis緩存使用的BigKey問題解決
一、什么是 BigKey?
BigKey 指在 Redis 中存儲的 單個 Key 對應的 Value 過大,通常表現(xiàn)為:
- String 類型:Value 長度 > 10KB。
- Hash/List/Set/ZSet:元素數(shù)量 > 5,000 或總大小 > 10MB。
二、BigKey 的危害
問題 | 影響 |
---|---|
內(nèi)存不均 | 導致集群節(jié)點內(nèi)存傾斜,可能觸發(fā) OOM。 |
阻塞請求 | 單線程模型下,操作 BigKey 耗時高,阻塞其他命令(如 DEL 大 Key 卡頓)。 |
網(wǎng)絡擁塞 | 大 Value 傳輸占用帶寬,影響其他請求延遲。 |
持久化故障 | AOF/RDB 保存大 Key 時耗時劇增,甚至失敗。 |
三、如何發(fā)現(xiàn) BigKey?
1. 使用 Redis 內(nèi)置命令 redis-cli --bigkeys
# 掃描 BigKey(Redis 4.0+) redis-cli --bigkeys # 輸出示例(匯總每種數(shù)據(jù)類型的最大 Key) [00.00%] Biggest string found so far 'user' with 10240 bytes [00.00%] Biggest hash found so far 'product' with 5000 fields
缺點:只能返回每種類型的最大 Key,無法全面掃描。
2. 使用 Redis 內(nèi)置命令 MEMORY USAGE
# 查看指定 Key 的內(nèi)存占用(Redis 4.0+) MEMORY USAGE user
缺點:只能返回指定Key的信息。
3. 使用 Redis 內(nèi)置命令 DEBUG OBJECT
# 查看指定 Key 信息 DEBUG OBJECT user
缺點:只能返回指定Key的信息。
4. 使用 Redis 內(nèi)置命令 SCAN + MEMORY USAGE 或 DEBUG OBJECT
使用sacn
命令掃描redis 中的key,結(jié)合 memory usage
或 debug object
判斷key 值大小
SCAN 0 MATCH order:* COUNT 100 HSCAN user:1000 0 # 遍歷 Hash 的字段 SSCAN followers 0 # 遍歷 Set 的成員 ZSCAN rankings 0 # 遍歷 ZSet 的成員和分數(shù)
可循環(huán)定時執(zhí)行scan命令遍歷出bigKey
5. 使用第三方工具
rdb-tools:分析 RDB 文件,統(tǒng)計大 Key。
pip install rdbtools rdb --command memory dump.rdb --bytes 10240 --type string
RedisInsight:圖形化工具直觀查看內(nèi)存分布。
四、BigKey 的解決方案
1. 拆分大 Key
String 類型:拆分為多個子 Key。
# 原始 Key SET user:1000:profile "超大JSON數(shù)據(jù)..." # 拆分為 SET user:1000:profile:part1 "JSON片段1" SET user:1000:profile:part2 "JSON片段2"
Hash/List/Set/ZSet:按字段或范圍分片。
# 原始 Hash HSET product:999:details name "手機" price 5000 ... (5000個字段) # 拆分為 HSET product:999:details:1 name "手機" price 5000 HSET product:999:details:2 field1001 "value1001" ...
2. 使用合適的數(shù)據(jù)結(jié)構(gòu)
替代方案:
場景 | 錯誤用法 | 優(yōu)化方案 |
---|---|---|
存儲用戶標簽 | SET 存儲 JSON 列表 | 改用 SET 或 ZSET |
頻繁更新的計數(shù)器 | String + INCR | 改用 HASH 分片存儲 |
3. 客戶端緩存
- 對熱點 BigKey 使用本地緩存(如 Caffeine),減少 Redis 訪問。
到此這篇關于Redis緩存使用的BigKey問題解決的文章就介紹到這了,更多相關Redis BigKey問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Redis?中ZSET數(shù)據(jù)類型命令使用及對應場景總結(jié)(案例詳解)
這篇文章主要介紹了Redis?中ZSET數(shù)據(jù)類型命令使用及對應場景總結(jié),本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01Redis 的查詢很快的原因解析及Redis 如何保證查詢的高效
由于redis是內(nèi)存數(shù)據(jù)庫,歸功于它的數(shù)據(jù)結(jié)構(gòu)所以查詢效率非常高,今天通過本文給大家介紹下Redis 的查詢很快的原因解析及Redis 如何保證查詢的高效,感興趣的朋友一起看看吧2022-03-03SpringSession通過Redis統(tǒng)計在線用戶數(shù)量的實現(xiàn)代碼
這篇文章主要介紹了SpringSession通過Redis統(tǒng)計在線用戶數(shù)量,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04如何操作Redis和zookeeper實現(xiàn)分布式鎖
這篇文章主要介紹了如何操作Redis和zookeeper實現(xiàn)分布式鎖的相關資料,需要的朋友可以參考下2017-07-07