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 單節(jié)點(diǎn)部署的實(shí)現(xiàn)
本文主要介紹了Redis 單節(jié)點(diǎn)部署的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06redis?Template.opsForValue()中方法實(shí)例詳解
這篇文章主要介紹了redis?Template.opsForValue()中方法講解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05redis和rabbitmq實(shí)現(xiàn)延時隊(duì)列的示例代碼
在高并發(fā)場景下,延遲隊(duì)列顯得尤為重要,本文主要介紹了兩種方式,redis和rabbitmq實(shí)現(xiàn)延時隊(duì)列,具有一定的參考價值,感興趣的可以了解一下2024-03-03redis安裝和配置_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了redis安裝和配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08無法連接redis服務(wù)器問題的解決辦法(非常詳細(xì)!)
這篇文章主要介紹了如何解決Spring?Boot項(xiàng)目連接Redis失敗的問題,通過修改Redis配置文件、添加防火墻白名單或關(guān)閉防火墻,并使用RESP工具進(jìn)行測試,需要的朋友可以參考下2025-02-02Redis實(shí)現(xiàn)用戶關(guān)注的項(xiàng)目實(shí)踐
本文主要介紹了Redis實(shí)現(xiàn)用戶關(guān)注的項(xiàng)目實(shí)踐,通過使用Redis的set數(shù)據(jù)結(jié)構(gòu)來存儲關(guān)注對象,方便高效地進(jìn)行添加和取消關(guān)注操作,具有一定的參考價值,感興趣的可以了解一下2024-02-02Redis的Sentinel解決方案介紹與運(yùn)行機(jī)制
這篇文章主要介紹了Redis的Sentinel解決方案介紹與運(yùn)行機(jī)制, Sentinel 是一款面向分布式服務(wù)架構(gòu)的輕量級流量控制組件,主要以流量為切入點(diǎn),從流量控制、熔斷降級、系統(tǒng)自適應(yīng)保護(hù)等多個維度來保障服務(wù)的穩(wěn)定性,需要的朋友可以參考下2023-07-07redis主從復(fù)制的原理及實(shí)現(xiàn)
Redis主從復(fù)制是一種數(shù)據(jù)同步機(jī)制,它通過將一個Redis實(shí)例的數(shù)據(jù)復(fù)制到其他Redis,本文主要介紹了redis主從復(fù)制的原理及實(shí)現(xiàn),具有一定的參考價值,感興趣的可以了解一下2023-08-08