Redis 大key的幾種刪除方式
在前面的文章 Redis刪除大key時為什么會阻塞中,有說到,不應(yīng)該直接調(diào)用 del 命令刪除key,容易造成請求被阻塞,那應(yīng)該如何來處理呢?
這次從代碼編寫的角度來舉例說明下。
在Redis中,有幾個比較特殊的結(jié)構(gòu)String,List、Hash、Set、ZSet, 從Redis刪除大key時為什么會阻塞中文章可以知道,不能直接del (除了string),而應(yīng)該使用 scan的方式,而每一個類型也都有自己的scan 方式。接下來以 Java Jedis 為例。
List
String key = "demo";
int length = jedis.llen("demo");
if (length > 1024) {
int size = 100;
int count = 0;
do {
//每次處理前100個
// redis內(nèi)部也會判斷當(dāng)前傳遞的索引有沒有超過當(dāng)前的list的長度
// 可參閱 ltrimCommand
jedis.ltrim(key, 0, size);
count += size;
}
while (count < length);
}
jedis.del(key);Set
String key = "demo";
long length = jedis.scard(key);
if (length > 1024) {
//每次遍歷100個
ScanParams scanParams = new ScanParams().count(100);
// 傳遞的游標(biāo)
java.lang.String cursor = "0";
ScanResult<String> sscan;
do {
//傳遞 scan的參數(shù)
sscan = jedis.sscan(key, cursor, scanParams);
if (!CollectionUtils.isEmpty(sscan.getResult())) {
// 遍歷返回的結(jié)果,依次刪除
sscan.getResult().stream().forEach(member -> {
jedis.srem(key, member);
});
}
// 傳入下次遍歷的游標(biāo)
cursor = sscan.getCursor();
} while (!sscan.isCompleteIteration());
}
jedis.del(key);ZSet
String key = "demo";
// 獲取zset的長度
long length = jedis.zcard(key);
if (length > 1024) {
int size = SIZE;
int count = 0;
do {
// 刪除指定的集合
jedis.zremrangeByRank(key, 0, size);
count += size;
}
while (count < length);
}
jedis.del(key);Hash
String key = "demo";
// 獲取Hash的字段個數(shù)
long length = jedis.hlen(key);
if (length > THROLD) {
ScanParams scanParams = new ScanParams();
// 遍歷大小
scanParams.count(SIZE);
// 匹配哪些字段
scanParams.match("*");
ScanResult<Map.Entry<String, String>> result;
java.lang.String cursor = "0";
do {
// 遍歷字段
result = jedis.hscan(key, cursor, scanParams);
if (!CollectionUtils.isEmpty(result.getResult())) {
// 刪除指定的字段
result.getResult().stream().forEach(x -> {
jedis.hdel(key, x.getKey());
});
}
cursor = result.getCursor();
} while (!result.isCompleteIteration());
}
jedis.del(key);到此這篇關(guān)于Redis 大key的幾種刪除方式的文章就介紹到這了,更多相關(guān)Redis 大key刪除內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis常見數(shù)據(jù)類型List列表使用詳解
Redis的List是一種有序的字符串集合,支持兩端高效插入和刪除,適用于隊列和棧,這篇文章主要介紹了Redis常見數(shù)據(jù)類型List列表使用的相關(guān)資料,需要的朋友可以參考下2024-12-12

