五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

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

發(fā)布日期:2022-01-29 20:58 | 文章來源:源碼中國(guó)

redis集群清理前綴相同的key

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

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

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

因?yàn)橛械臄?shù)字在redis中可能不存在,而且更重要的一點(diǎn),如果有超過7億的數(shù)字,這部分?jǐn)?shù)據(jù)不會(huì)被清除,擴(kuò)展性很差。

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

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

(2)獲取到key集合之后,再遍歷這些key,使用JedisClusterCRC16.getSlot(key)方法,定位到key所在的slot,把在同一個(gè)slot的key批量刪除,這樣做,第一能保證需要?jiǎng)h的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長(zhǎng)度:{}" , 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操作的時(shí)候,這些key必須在同一個(gè)slot上,
     * 不然會(huì)報(bào):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("刪除:{}個(gè)",count);
    countX++;
}  
                     }
                }
//                 logger.info("刪除完成,共刪除:{}個(gè)",countX);
                    logger.info("刪除userid key任務(wù)結(jié)束,一共刪除key數(shù)量:{},耗時(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;
    }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持本站。

香港服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對(duì)1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部