Redis 大key的幾種刪除方式
在前面的文章 Redis刪除大key時(shí)為什么會(huì)阻塞中,有說(shuō)到,不應(yīng)該直接調(diào)用 del 命令刪除key,容易造成請(qǐng)求被阻塞,那應(yīng)該如何來(lái)處理呢?
這次從代碼編寫的角度來(lái)舉例說(shuō)明下。
在Redis中,有幾個(gè)比較特殊的結(jié)構(gòu)String,List、Hash、Set、ZSet, 從Redis刪除大key時(shí)為什么會(huì)阻塞中文章可以知道,不能直接del (除了string),而應(yīng)該使用 scan的方式,而每一個(gè)類型也都有自己的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的11種Web應(yīng)用場(chǎng)景簡(jiǎn)介
一些Redis原語(yǔ)命令比如LPUSH、LTRIM和 LREM等等能夠用來(lái)幫助開發(fā)者完成需要的任務(wù)——這些任務(wù)在傳統(tǒng)的數(shù)據(jù)庫(kù)存儲(chǔ)中非常困難或緩慢。這是一篇非常有用并且實(shí)際的文章。那么要如何在你的框架中完成這些任務(wù)呢?2015-09-09windows環(huán)境下Redis+Spring緩存實(shí)例講解
這篇文章主要為大家詳細(xì)介紹了windows環(huán)境下Redis+Spring緩存實(shí)例教程,感興趣的小伙伴們可以參考一下2016-04-04Redis+IDEA實(shí)現(xiàn)單機(jī)鎖和分布式鎖的過(guò)程
這篇文章主要介紹了Redis+IDEA實(shí)現(xiàn)單機(jī)鎖和分布式鎖的過(guò)程,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07關(guān)于redis狀態(tài)監(jiān)控和性能調(diào)優(yōu)詳解
Redis是一種高級(jí)key-value數(shù)據(jù)庫(kù)。它跟memcached類似,不過(guò)數(shù)據(jù)可以持久化,而且支持的數(shù)據(jù)類型很豐富。有字符串,鏈表、哈希、集合和有序集合5種。下面這篇文章主要給大家介紹了關(guān)于redis狀態(tài)監(jiān)控和性能調(diào)優(yōu)的相關(guān)資料,需要的朋友可以參考下。2017-09-09解讀redis?slaveof命令執(zhí)行后為什么需要清庫(kù)重新同步
這篇文章主要介紹了redis?slaveof命令執(zhí)行后為什么需要清庫(kù)重新同步,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04redis實(shí)現(xiàn)分布式的方法總結(jié)
在本篇文章中小編給大家整理了關(guān)于redis分布式怎么做的具體內(nèi)容以及知識(shí)點(diǎn)總結(jié),有興趣的朋友們參考下。2019-06-06