目錄
- 1、什么是大key
- 2、大key的危害
- 【1】阻塞風險
- 【2】網絡阻塞
- 【3】內存不均
- 【4】持久化問題
- 3、如何發現大key
- 【1】使用內置命令
- 【2】使用memory命令(Redis 4.0+)
- 【3】使用scan命令
- 【4】監控工具
- 4、解決方案
- 【1】拆分大key
- 【2】使用合適的數據結構
- 【3】設置過期時間
- 【4】漸進式刪除
- 【5】客戶端緩存
- 5、最佳實踐
- 【1】設計階段預防
- 【2】監控告警
- 【3】讀寫優化
1、什么是大key
在redis中,大key通常指以下三種情況之一:
1、value過大:單個key的value體積過大(如字符串值超過10KB,集合/列表/哈希/有序集合元素過多)
2、元素過多:集合類型(hash/list/set/zset)中包含大量元素(如超過5000個元素)
3、結構復雜:key對應的數據結構嵌套過深或過于復雜
2、大key的危害
【1】阻塞風險
1、大key的讀寫操作會消耗更多CPU和內存。
2、可能會導致redis阻塞,影響其他請求的響應時間。
【2】網絡阻塞
1、大key傳輸會占用大量帶寬。
2、可能會導致集群節點間同步延遲。
【3】內存不均
1、在集群模式下,大key會導致數據分片不均衡。
2、可能造成某些節點內存壓力過大。
【4】持久化問題
1、AOF重寫和RDB生成時處理大key會變慢。
2、可能導致持久化失敗或服務暫停。
3、如何發現大key
【1】使用內置命令
redis-cli --bigkeys #掃描并統計大key
【2】使用memory命令(Redis 4.0+)
MEMORY USAGE key_name #查看指定key的內存使用
【3】使用scan命令
redis-cli --scan --pattern '*' | while read key; do echo "$key: $(redis-cli memory usage "$key")"; done
【4】監控工具
1、RedisInsight
2、Redis Desktop Manager
4、解決方案
【1】拆分大key
1、將大hash拆分成多個小hash
2、對大list/set進行分片
【2】使用合適的數據結構
1、根據合適的業務場景使用合適的數據結構
【3】設置過期時間
1、EXPIRE key seconds
【4】漸進式刪除
1、對大key刪除,使用UNLINK代替DEL(非阻塞)
2、對集合類型,分批刪除
【5】客戶端緩存
1、對不常變更的大key使用客戶端緩存
5、最佳實踐
【1】設計階段預防
1、預估數據規模,提前設計合理的key結構
2、避免單個key存儲過多數據
【2】監控告警
1、設置大key監控告警
2、定期掃描和清理
【3】讀寫優化
1、對大key使用pipeline減少網絡往返
2、避免對大key進行范圍操作