Redis 大key的幾種刪除方式
在前面的文章 Redis刪除大key時(shí)為什么會(huì)阻塞中,有說(shuō)到,不應(yīng)該直接調(diào)用 del 命令刪除key,容易造成請(qǐng)求被阻塞,那應(yīng)該如何來(lái)處理呢?
這次從代碼編寫(xiě)的角度來(lái)舉例說(shuō)明下。
在Redis中,有幾個(gè)比較特殊的結(jié)構(gòu)String,List、Hash、Set、ZSet, 從Redis刪除大key時(shí)為什么會(huì)阻塞中文章可以知道,不能直接del (除了string),而應(yīng)該使用 scan的方式,而每一個(gè)類(lèi)型也都有自己的scan 方式。接下來(lái)以 Java Jedis 為例。
List
String key = "demo";
int length = jedis.llen("demo");
if (length > 1024) {
int size = 100;
int count = 0;
do {
//每次處理前100個(gè)
// redis內(nèi)部也會(huì)判斷當(dāng)前傳遞的索引有沒(méi)有超過(guò)當(dāng)前的list的長(zhǎng)度
// 可參閱 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個(gè)
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的長(zhǎng)度
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的字段個(gè)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis 單節(jié)點(diǎn)部署的實(shí)現(xiàn)
本文主要介紹了Redis 單節(jié)點(diǎn)部署的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
redis?Template.opsForValue()中方法實(shí)例詳解
這篇文章主要介紹了redis?Template.opsForValue()中方法講解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列的示例代碼
在高并發(fā)場(chǎng)景下,延遲隊(duì)列顯得尤為重要,本文主要介紹了兩種方式,redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
redis安裝和配置_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis安裝和配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
無(wú)法連接redis服務(wù)器問(wèn)題的解決辦法(非常詳細(xì)!)
這篇文章主要介紹了如何解決Spring?Boot項(xiàng)目連接Redis失敗的問(wèn)題,通過(guò)修改Redis配置文件、添加防火墻白名單或關(guān)閉防火墻,并使用RESP工具進(jìn)行測(cè)試,需要的朋友可以參考下2025-02-02
Redis實(shí)現(xiàn)用戶關(guān)注的項(xiàng)目實(shí)踐
本文主要介紹了Redis實(shí)現(xiàn)用戶關(guān)注的項(xiàng)目實(shí)踐,通過(guò)使用Redis的set數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)關(guān)注對(duì)象,方便高效地進(jìn)行添加和取消關(guān)注操作,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
Redis的Sentinel解決方案介紹與運(yùn)行機(jī)制
這篇文章主要介紹了Redis的Sentinel解決方案介紹與運(yùn)行機(jī)制, Sentinel 是一款面向分布式服務(wù)架構(gòu)的輕量級(jí)流量控制組件,主要以流量為切入點(diǎn),從流量控制、熔斷降級(jí)、系統(tǒng)自適應(yīng)保護(hù)等多個(gè)維度來(lái)保障服務(wù)的穩(wěn)定性,需要的朋友可以參考下2023-07-07
redis主從復(fù)制的原理及實(shí)現(xiàn)
Redis主從復(fù)制是一種數(shù)據(jù)同步機(jī)制,它通過(guò)將一個(gè)Redis實(shí)例的數(shù)據(jù)復(fù)制到其他Redis,本文主要介紹了redis主從復(fù)制的原理及實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08

