Redis大key問題及解讀
1、什么是大key
在redis中,大key通常指以下三種情況之一:
1、value過大:單個key的value體積過大(如字符串值超過10KB,集合/列表/哈希/有序集合元素過多)
2、元素過多:集合類型(hash/list/set/zset)中包含大量元素(如超過5000個元素)
3、結(jié)構(gòu)復(fù)雜:key對應(yīng)的數(shù)據(jù)結(jié)構(gòu)嵌套過深或過于復(fù)雜
2、大key的危害
【1】阻塞風(fēng)險
1、大key的讀寫操作會消耗更多CPU和內(nèi)存。
2、可能會導(dǎo)致redis阻塞,影響其他請求的響應(yīng)時間。
【2】網(wǎng)絡(luò)阻塞
1、大key傳輸會占用大量帶寬。
2、可能會導(dǎo)致集群節(jié)點間同步延遲。
【3】內(nèi)存不均
1、在集群模式下,大key會導(dǎo)致數(shù)據(jù)分片不均衡。
2、可能造成某些節(jié)點內(nèi)存壓力過大。
【4】持久化問題
1、AOF重寫和RDB生成時處理大key會變慢。
2、可能導(dǎo)致持久化失敗或服務(wù)暫停。
3、如何發(fā)現(xiàn)大key
【1】使用內(nèi)置命令
redis-cli --bigkeys #掃描并統(tǒng)計大key
【2】使用memory命令(Redis 4.0+)
MEMORY USAGE key_name #查看指定key的內(nèi)存使用
【3】使用scan命令
redis-cli --scan --pattern '*' | while read key; do echo "$key: $(redis-cli memory usage "$key")"; done
【4】監(jiān)控工具
1、RedisInsight 2、Redis Desktop Manager
4、解決方案
【1】拆分大key
1、將大hash拆分成多個小hash
2、對大list/set進(jìn)行分片
【2】使用合適的數(shù)據(jù)結(jié)構(gòu)
1、根據(jù)合適的業(yè)務(wù)場景使用合適的數(shù)據(jù)結(jié)構(gòu)
【3】設(shè)置過期時間
1、EXPIRE key seconds
【4】漸進(jìn)式刪除
1、對大key刪除,使用UNLINK代替DEL(非阻塞)
2、對集合類型,分批刪除
【5】客戶端緩存
1、對不常變更的大key使用客戶端緩存
5、最佳實踐
【1】設(shè)計階段預(yù)防
1、預(yù)估數(shù)據(jù)規(guī)模,提前設(shè)計合理的key結(jié)構(gòu)
2、避免單個key存儲過多數(shù)據(jù)
【2】監(jiān)控告警
1、設(shè)置大key監(jiān)控告警
2、定期掃描和清理
【3】讀寫優(yōu)化
1、對大key使用pipeline減少網(wǎng)絡(luò)往返
2、避免對大key進(jìn)行范圍操作
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
redis中hiredis-API函數(shù)的調(diào)用方法
這篇文章主要介紹了redis中hiredis-API函數(shù)的調(diào)用,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2023-09-09Redis對批量數(shù)據(jù)實現(xiàn)分布式鎖的實現(xiàn)代碼
為了防止多人多電腦同時操作一條數(shù)據(jù),我們自己開發(fā)了一個簡單的基于Redis實現(xiàn)的分布式鎖,Redis對批量數(shù)據(jù)實現(xiàn)分布式鎖相關(guān)知識感興趣的朋友一起看看吧2022-03-03通過 Redis 實現(xiàn) RPC 遠(yuǎn)程方法調(diào)用(支持多種編程語言)
這篇文章主要介紹了通過 Redis 實現(xiàn) RPC 遠(yuǎn)程方法調(diào)用,支持多種編程語言,本文就以Ruby和Python為例,給出了實現(xiàn)代碼,需要的朋友可以參考下2014-09-09