日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java jediscluster_方便jediscluster操作的工具类

發(fā)布時(shí)間:2025/3/21 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java jediscluster_方便jediscluster操作的工具类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

由于redis的集群 redis cluster不支持keys這樣的多key操作(具體原因由于sharding 后,不同的key屬于不同的slot,難以支持原子操作)。所以如果一個(gè)對外需要對緩存做失效處理時(shí)比較棘手。所以本類提供工具方法再redis cluster查找按照hashTags處理的keys和一般的keys。基于jedis cluster實(shí)現(xiàn)。

有優(yōu)化空間,現(xiàn)在懶得改了

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import java.util.Set;

import java.util.TreeSet;

import org.apache.commons.collections4.CollectionUtils;

import com.google.common.collect.Lists;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisCluster;

import redis.clients.jedis.JedisPool;

import redis.clients.util.JedisClusterCRC16;

public interface RedisCacheSupporter {

String SEPARATOR = RedisCacheBase.staticSeparator();

String CONJUNCTION = RedisCacheBase.staticConjunction();

String PLACEHOLDER = RedisCacheBase.staticPlaceHolder();

String LEFT_TAG_STR = RedisCacheBase.staticLeftTagStr();

String RIGHT_TAG_STR = RedisCacheBase.staticRightTagStr();

static String hashTagsPrefix(String cacheKeyPrefix) {

return LEFT_TAG_STR + cacheKeyPrefix + RIGHT_TAG_STR;

}

static TreeSet keys(JedisCluster jedisClusterClient, String cachePrefix) {

Map clusterNodes = jedisClusterClient.getClusterNodes();

TreeSet keys = new TreeSet<>();

String strPattern = cachePrefix + "*";

for (String k : clusterNodes.keySet()) {

JedisPool jp = clusterNodes.get(k);

try (Jedis jedis = jp.getResource();) {

if (jedis.info("replication").contains("role:slave"))

continue;

Set keysInNode = jedis.keys(strPattern);

keys.addAll(keysInNode);

}

}

return keys;

}

static boolean delByKey(JedisCluster jedisClusterClient, String cacheKey) {

return jedisClusterClient.del(cacheKey) > 0;

}

/**

* 緩存前綴通過hash tags {@link #hashTagsPrefix(String)}處理過的key首選使用本方法

*

*

* hash tags在redis集群reSharding時(shí),不能保證都在同一slot下,所以為代碼健壯性考慮可首先調(diào)用本方法再捕獲異常中調(diào)用{@link #delLoopNodesByPrefix(JedisCluster, String)}方法處理

* @param jedisClusterClient

* @param cachePrefix

*/

static void delAllByPrefix(JedisCluster jedisClusterClient, String cachePrefix) {

Set keys = keys(jedisClusterClient, cachePrefix);

if (CollectionUtils.isEmpty(keys)) {

return;

}

jedisClusterClient.del(keys.toArray(new String[keys.size()]));

}

static void delLoopNodesByPrefix(JedisCluster jedisClusterClient, String cachePrefix) {

String keysPattern = cachePrefix + "*";

Map clusterNodes = jedisClusterClient.getClusterNodes();

for (String k : clusterNodes.keySet()) {

JedisPool jedisPool = clusterNodes.get(k);

try (Jedis jedis = jedisPool.getResource()) {

if (jedis.info("replication").contains("role:slave"))

continue;// 從節(jié)點(diǎn)不處理

Set keys = jedis.keys(keysPattern);

if (keys.size() <= 0)

continue;

Map> map = new HashMap<>();

for (String key : keys) {

// cluster模式執(zhí)行多key操作的時(shí)候,這些key必須在同一個(gè)slot上

// 不然會報(bào):redis.clients.jedis.exceptions.JedisClusterException:

// No way to dispatch this command to Redis Cluster because keys have different slots.

int slot = JedisClusterCRC16.getSlot(key);

// 按slot將key分組,相同slot的key一起提交

if (map.containsKey(slot)) {

map.get(slot).add(key);

} else {

map.put(slot, Lists.newArrayList(key));

}

}

for (Integer slotKey : map.keySet()) {

jedis.del(map.get(slotKey).toArray(new String[map.get(slotKey).size()]));

}

}

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java jediscluster_方便jediscluster操作的工具类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。