最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

redis集群實現(xiàn)清理前綴相同的key

 更新時間:2021年10月12日 15:26:53   作者:浮白齋主人  
這篇文章主要介紹了redis集群實現(xiàn)清理前綴相同的key,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

redis集群清理前綴相同的key

最近經(jīng)常收到redis集群告警,每天收到50多封郵件,實在不勝其煩,內(nèi)存不夠用,原因是有一些無用的key(約3000萬)占用內(nèi)存(具體不說了)。這部分內(nèi)存不能被釋放。

原來的定期清理腳本的邏輯

打開一個redis鏈接,在內(nèi)部循環(huán)從1000萬到7億之間的數(shù)據(jù),然后加上前綴去批量刪除,這種方式屬于廣撒網(wǎng)式的清理,窮舉法,不但耗時,效果也不好。

因為有的數(shù)字在redis中可能不存在,而且更重要的一點,如果有超過7億的數(shù)字,這部分數(shù)據(jù)不會被清除,擴展性很差。

(1)那么如何清理呢?redis集群沒有keys這種方法,那么如何能快速準確地定位到這批key呢?

我們可以根據(jù)RedisCluster集群提供的getClusterNodes方法,獲取到這個redis-cluster的每個節(jié)點,然后再去逐個遍歷節(jié)點,獲取節(jié)點的Jedis對像,使用單個jedis對像 再去獲取前綴相同的keys

(2)獲取到key集合之后,再遍歷這些key,使用JedisClusterCRC16.getSlot(key)方法,定位到key所在的slot,把在同一個slot的key批量刪除,這樣做,第一能保證需要刪的key都存在于redis集群,第二批量刪除,提高效率。

具體代碼:

Map<String, JedisPool> clusterNodes = jedis.getClusterNodes();
                String keysPattern =  keyPrefix + ":*";
                long countX = 0;
                long sTime = System.currentTimeMillis();
                for (Map.Entry<String, JedisPool> entry : clusterNodes.entrySet()) {  
                    Jedis jedisNode = entry.getValue().getResource();  
                    logger.info("redisip:{},port:{}" , jedisNode.getClient().getHost(), jedisNode.getClient().getPort());
                    if (!jedisNode.info("replication").contains("role:slave")) {  
                          Set<String> keys = jedisNode.keys(keysPattern);
                          logger.info("keys長度:{}" , keys.size());
                          Map<Integer, List<String>> map = new HashMap<>(6600);  
                          long countTmp = 0;
                            for (String key : keys) { int slot = JedisClusterCRC16.getSlot(key);
                                /**
                                 * cluster模式執(zhí)行多key操作的時候,這些key必須在同一個slot上,
                                 * 不然會報:JedisDataException 
                                 */
                                //按slot將key分組,相同slot的key一起提交  
                                if (map.containsKey(slot)) {  
                                    map.get(slot).add(key);  
                                } else {  
                                     List<String> keyList = new ArrayList<String>();
                                     keyList.add(key);
                                     map.put(slot, keyList);  
                                    }
                                 
                            }
                            long count = 0;
                            for (Map.Entry<Integer, List<String>> integerListEntry : map.entrySet()) {  
                                count += jedisNode.del(integerListEntry.getValue().toArray(new String[integerListEntry.getValue().size()]));  
                                logger.info("刪除:{}個",count);
                                countX++;
                            }  
                     }
                }
//                 logger.info("刪除完成,共刪除:{}個",countX);
                    logger.info("刪除userid key任務(wù)結(jié)束,一共刪除key數(shù)量:{},耗時:{}", countX , System.currentTimeMillis() - sTime);

redis集群(jedis)批量刪除同一前綴

public Set<String> getByPrefix(String key) {
        Set<String> setResult = new HashSet<>();
        try {
            ShardedJedis jedis  = redisDataSource.getJedisClient();
            Iterator<Jedis> jedisIterator = jedis.getAllShards().iterator();
            while(jedisIterator.hasNext()){
                setResult = jedisIterator.next().keys(key+"*");
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return setResult;
    }

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • redis保存session信息的示例代碼

    redis保存session信息的示例代碼

    本文實現(xiàn)一個將session信息保存在 redis中,多個tomcat中的工程都從redis獲取session信息的示例,本文給大家講解的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-01-01
  • Redis高可用部署架構(gòu)的實現(xiàn)

    Redis高可用部署架構(gòu)的實現(xiàn)

    本文主要介紹了Redis高可用部署架構(gòu)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2023-08-08
  • Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別

    Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別

    這篇文章主要介紹了Redis?的內(nèi)存淘汰策略和過期刪除策略的區(qū)別,Redis?是可以對?key?設(shè)置過期時間的,因此需要有相應(yīng)的機制將已過期的鍵值對刪除,而做這個工作的就是過期鍵值刪除策略
    2022-07-07
  • 淺談一下Redis的數(shù)據(jù)結(jié)構(gòu)

    淺談一下Redis的數(shù)據(jù)結(jié)構(gòu)

    這篇文章主要介紹了淺談一下Redis的數(shù)據(jù)結(jié)構(gòu),簡單字符串結(jié)構(gòu)被用于存儲redis的key對象和String類型的value對象,其中的free和len字段可以輕松的使得在該字符串被修改時判斷是否需要擴容,需要的朋友可以參考下
    2023-08-08
  • redis并發(fā)之跳表的實現(xiàn)

    redis并發(fā)之跳表的實現(xiàn)

    跳表是一種用于實現(xiàn)有序集合的數(shù)據(jù)結(jié)構(gòu),本文主要介紹了redis并發(fā)之跳表的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • redis通過lua腳本,獲取滿足key pattern的所有值方式

    redis通過lua腳本,獲取滿足key pattern的所有值方式

    這篇文章主要介紹了redis通過lua腳本,獲取滿足key pattern的所有值方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Redis如何實現(xiàn)計數(shù)統(tǒng)計

    Redis如何實現(xiàn)計數(shù)統(tǒng)計

    這篇文章主要介紹了Redis如何實現(xiàn)計數(shù)統(tǒng)計方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Redis數(shù)據(jù)庫分布式設(shè)計方案介紹

    Redis數(shù)據(jù)庫分布式設(shè)計方案介紹

    大家好,本篇文章主要講的是Redis數(shù)據(jù)庫分布式設(shè)計方案介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Redis?RESP?協(xié)議實現(xiàn)實例詳解

    Redis?RESP?協(xié)議實現(xiàn)實例詳解

    這篇文章主要為大家介紹了Redis?RESP?協(xié)議實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • window手動操作清理redis緩存的技巧總結(jié)

    window手動操作清理redis緩存的技巧總結(jié)

    在本篇文章中小編給大家分享了關(guān)于window環(huán)境手動操作清理redis緩存的方法和技巧,有興趣的朋友們可以跟著學(xué)習下。
    2019-07-07

最新評論

兴国县| 留坝县| 永顺县| 来凤县| 高邮市| 平昌县| 西城区| 宝丰县| 黔南| 晋宁县| 茌平县| 商洛市| 曲沃县| 云南省| 迁西县| 辽阳县| 闽清县| 枝江市| 资阳市| 铁力市| 嘉兴市| 绍兴市| 伊通| 平山县| 枣庄市| 东至县| 岳西县| 邳州市| 连云港市| 安化县| 普定县| 山东| 乌兰县| 宁强县| 天台县| 玉环县| 安吉县| 青神县| 溧水县| 吉首市| 香格里拉县|