Redis?BigKey的問題解決
什么是BigKey?
BigKey指的是redis中一些key value值很大,這些key在序列化與反序列化過程中花費的時間很大! 操作bigkey的通常比較耗時,也就意味著阻塞Redis可能性越大!占用的流量同時也會變得很大!
大白話就是bigkey實際指一個key對應的value很大,占用的空間很大!
string長度大于10K,list長度大于10240認為是big bigkeys
如何查看Redis中的bigKey?
我們以String為例:
先存儲幾個String key進去,然后使用命令!
查看所有BigKey
redis-cli自帶的一個命令(不需要連接Redis)。對整個redis進行掃描,尋找較大的key。
redis-cli -h 127.0.0.1 -p 6379 --bigkeys

Redis中有3個String , 可以看到發(fā)現(xiàn)一個BigKey key3
獲取key3的值 看看
該命令使用scan方式對key進行統(tǒng)計,所以使用時無需擔心對redis造成阻塞。
輸出大概分為兩部分,summary之上的部分,只是顯示了掃描的過程。
- summary部分給出了每種數(shù)據(jù)結(jié)構(gòu)中最大的Key。
- 統(tǒng)計出的最大key只有string類型是以字節(jié)長度為衡量標準的。
- list,set,zset等都是以元素個數(shù)作為衡量標準,不能說明其占的內(nèi)存就一定多。所以,
如果你的Key主要以string類型存在,這種方法就比較適合。
我的hash中

key3值

這種是查看所有的key 是否是bigKey
查看單個Key
debug object

其中serializedlength表示key對應的value序列化之后的字節(jié)數(shù)
注意:
debug object bigkey本身可能就會比較慢,它本身就會存在阻塞Redis的可能,可能會比較危險、而且不太準確(序列化后的長度);
memory usage
Redis 4.0開始提供memory usage命令可以計算每個鍵值的字節(jié)數(shù)
如何優(yōu)化
優(yōu)化big key的原則就是string減少字符串長度,list、hash、set、zset等減少成員數(shù);
string長度大于10K,list長度大于10240認為是big bigkeys
1 拆分
如果對象是整存爭取
將對象拆分后才能多個小key-value,get不同的key或者批量獲取stringRedisTemplate.opsForValue() .multiGet(keyList)如果對象是部分更新獲取數(shù)據(jù)
可以分拆成幾個key-value,也可以存儲在hash中,部分更新部分存取!
如果是hash ,set,zset ,list 等元素
固定一個桶的數(shù)量,比如1000,每次存取的時候,先在本地計算field的hash值,模除1000,確定該field落在哪個key上。
newHashKey = hashKey + (hash(field) % 1000);
hset(newHashKey, field, value);
hget(newHashKey, field)
set, zset, list 也可以類似上述做法!
2 本地緩存
減少訪問redis次數(shù),降低危害減少訪問redis次數(shù),降低危害! 當然本地開銷也會變大!
到此這篇關(guān)于Redis BigKey的問題解決的文章就介紹到這了,更多相關(guān)Redis BigKey內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

