Redis 大Key的刪除的實(shí)現(xiàn)策略
1 定義
Redis大Key其實(shí)不是指的是Key,而是指Key對應(yīng)的Value。
Redis的String類型,最大可以存512MB的值,List、Hash、Set、ZSet等,可以存儲232個(gè)元素(大約42億多點(diǎn)),那么多大的Key算大Key呢?
一般來說,我們String需要控制在10KB以下,而集合類型的控制元素個(gè)數(shù)在5000個(gè)以下。
2 如何導(dǎo)致的大Key
一種,比如社交類的場景,如粉絲數(shù)增多,另外一種,可能由于報(bào)表等常年累月的積累,有可能導(dǎo)致大Key。
我們知道,由于Redis工作線程是單線程的,大Key刪除會導(dǎo)致網(wǎng)絡(luò)瀏覽阻塞、超時(shí)等一系列問題,那么我們就應(yīng)該去防止大KEY的產(chǎn)生
3 如何檢測大Key
一般來說,有兩種方法:
- 使用
--bigkeys:掃描所有的鍵,給出每種數(shù)據(jù)結(jié)構(gòu)Top 1 bigkey
[root@localhost ~]# redis-cli -a Redis密碼 --bigkeys Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe. # Scanning the entire keyspace to find biggest keys as well as # average sizes per key type. You can use -i 0.1 to sleep 0.1 sec # per 100 SCAN commands (not usually needed). [00.00%] Biggest string found so far '"k5889"' with 5 bytes [00.00%] Biggest string found so far '"k607267"' with 7 bytes [00.00%] Biggest string found so far '"k1802564"' with 8 bytes [50.00%] Sampled 1000000 keys so far [100.00%] Sampled 2000000 keys so far -------- summary ------- Sampled 2000000 keys in the keyspace! Total key length in bytes is 14888896 (avg len 7.44) Biggest string found '"k1802564"' has 8 bytes 0 lists with 0 items (00.00% of keys, avg size 0.00) 0 hashs with 0 fields (00.00% of keys, avg size 0.00) 2000000 strings with 14888896 bytes (100.00% of keys, avg size 7.44) 0 streams with 0 entries (00.00% of keys, avg size 0.00) 0 sets with 0 members (00.00% of keys, avg size 0.00) 0 zsets with 0 members (00.00% of keys, avg size 0.00)
- 使用
Memery Usage:獲取一個(gè)鍵的所占內(nèi)存
127.0.0.1:6379> MEMORY USAGE k10000 (integer) 64
4 大Key的刪除
4.1 String類型
String類型一般用Del即可,如果過于龐大可以使用Unlink
4.2 Hash類型
使用hscan每次獲取少量field-value,再使用hdel刪除每個(gè)field
public void delBigHash(String bigHashKey) {
ScanParams scanParams = new ScanParams().count(100);
String cursor = "0";
do {
ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams);
List<Entry<String, String>> entryList = scanResult.getResult();
if (CollectionUtils.isNotEmpty(entryList)) {
for (Entry<String, String> entry : entryList) {
jedis.hdel(bigHashKey, entry.getKey());
}
}
cursor = scanResult.getCursor();
} while (!"0".equals(cursor));
jedis.del(bigHashKey);
}
4.3 List類型
使用ltrim漸進(jìn)式逐步刪除,直到全部刪除完成
public void delBigList(String bigListKey){
long llen = jedis.llen(bigListKey);
int counter = 0;
int left = 100;
while (counter < llen) {
jedis.ltrim(bigListKey, left, llen);
counter += left;
}
jedis.del(bigListKey);
}
4.4 Set類型
使用sscan每次獲取部分元素,再使用srem命令刪除每個(gè)元素
public void delBigSet(String bigSetKey){
ScanParams scanParams = new ScanParams().count(100);
String cursor = "0";
do {
ScanResult<String> scanResult = jedis.sscan(bigSetKey, cursor, scanParams);
List<String> memberList = scanResult.getResult();
if (CollectionUtils.isNotEmpty(memberList)) {
for (String member : memberList) {
jedis.srem(bigSetKey, member);
}
}
cursor = scanResult.getCursor();
} while (!"0".equals(cursor));
jedis.del(bigSetKey);
}
4.5 ZSet類型
使用zscan每次獲取部分元素,再使用ZREMRANGEBYRANK命令刪除每個(gè)元素
public void delBigZSet(String bigZSetKey){
ScanParams scanParams = new ScanParams().count(100);
String cursor = "0";
do {
ScanResult<Tuple> scanResult = jedis.zscan(bigZSetKey, cursor, scanParams);
List<Tuple> tupleList = scanResult.getResult();
if (CollectionUtils.isNotEmpty(tupleList)) {
for (Tuple tuple : tupleList) {
jedis.zrem(bigZSetKey, tuple.getElement());
}
}
cursor = scanResult.getCursor();
} while (!"0".equals(cursor));
jedis.del(bigZSetKey);
}到此這篇關(guān)于Redis 大Key的刪除的實(shí)現(xiàn)策略的文章就介紹到這了,更多相關(guān)Redis 大Key刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
redis和redission分布式鎖原理及區(qū)別說明
文章對比了synchronized、樂觀鎖、Redis分布式鎖及Redission鎖的原理與區(qū)別,指出在集群環(huán)境下synchronized失效,樂觀鎖存在數(shù)據(jù)庫性能瓶頸,而Redission通過watchdog自動(dòng)續(xù)期和Lua原子操作解決Redis鎖的超時(shí)問題,推薦其在高并發(fā)場景下的可靠性與易用性2025-08-08
Redis數(shù)據(jù)遷移RedisShake的實(shí)現(xiàn)方法
本文主要介紹了Redis數(shù)據(jù)遷移RedisShake的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
解密Redis助力雙11背后電商秒殺系統(tǒng)(推薦)
這篇文章主要介紹了解密Redis助力雙11背后電商秒殺系統(tǒng),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Redis migrate數(shù)據(jù)遷移工具的使用教程
這篇文章主要給大家介紹了關(guān)于Redis migrate數(shù)據(jù)遷移工具的使用教程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

