jediscluster api_java.lang.throwable

jediscluster api_java.lang.throwable由于redis的集群rediscluster不支持keys这样的多key操作(具体原因由于sharding后,不同的key属于不同的slot,难以支持原子操作)。所以如果一个对外需要对缓存做失效处理时比较棘手。所以本类提供工具方法再rediscluster查找按照hashTags处理的keys和一般的keys。基于jediscluster实现。有优化空间,现在懒得改了importjav…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

由于redis的集群 redis cluster不支持keys这样的多key操作(具体原因由于sharding 后,不同的key属于不同的slot,难以支持原子操作)。所以如果一个对外需要对缓存做失效处理时比较棘手。所以本类提供工具方法再redis cluster查找按照hashTags处理的keys和一般的keys。基于jedis cluster实现。

有优化空间,现在懒得改了

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时,不能保证都在同一slot下,所以为代码健壮性考虑可首先调用本方法再捕获异常中调用{@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;// 从节点不处理

Set keys = jedis.keys(keysPattern);

if (keys.size() <= 0)

continue;

Map> map = new HashMap<>();

for (String key : keys) {

// cluster模式执行多key操作的时候,这些key必须在同一个slot上

// 不然会报: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()]));

}

}

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182080.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 托尔斯泰《安娜·卡列尼娜》主要人物

    托尔斯泰《安娜·卡列尼娜》主要人物版本:上海译文2013版译者高慧群等奥博朗斯基公爵:斯捷潘·阿尔卡季奇·奥勃朗斯基公爵(在社交场合他叫斯季瓦)达里娅·亚历山德罗夫娜,小名多莉,公爵夫人格里沙——小儿子塔尼娅——大女儿,与安娜八岁的谢廖扎同年马特维——仆人马特廖娜·菲利莫诺夫娜——奶妈马特廖莎,捷连季——车夫阿尼奇金伯爵——斯季瓦的新任长官瓦尔瓦拉,公爵小姐——斯捷潘的姑妈,多莉早就认识她,对她并不尊重。她知道公爵小姐瓦尔瓦拉整个一生都在富裕的亲戚家里当食客。斯季瓦说,她一生的整个目标就是要证明自己比卡捷琳娜·帕夫洛

    2022年5月25日
    385
  • m3u8文件合并 app(m3u8合并失败)

    电脑端合成m3u8方法利用.bat文件步骤如下手机端PC端利用.bat文件bat文件是dos下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为.bat或.cmd。在命令提示下输入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们[1]。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。入侵者常常通过批处理文件的编写来实现多工具的组合入侵、自动入侵及结果提取等功能。链接:百度百

    2022年4月13日
    310
  • API接口重复提交

    API接口重复提交

    2021年11月6日
    42
  • 模拟实现网易新闻客户端主界面(侧滑SlidingMenu+ViewPager+Fragment)

    模拟实现网易新闻客户端主界面(侧滑SlidingMenu+ViewPager+Fragment)

    2021年8月25日
    70
  • 渗透——目录扫描神器DirBuster用法

    渗透——目录扫描神器DirBuster用法一、渗透测试的简介:渗透测试可以使用不同的方法进行,成为黑、灰和白盒。黑盒是指测试团队除了服务器的URL外,没有关于要测试的应用程序的任何以前的信息;白盒表示团队拥有目标、基础架构、软件版本、测试用户、开发信息等所有信息;灰盒是介于黑盒和白盒中之间的一个点。对于黑盒方法和灰盒方法,正如我们在上一章中看到的那样,侦察阶段对于测试团队发现应用程序所有者可以在白盒方法中提供的信息是必要的。继续…

    2025年6月24日
    3
  • idea 2021.4.3 永久激活码(破解版激活)

    idea 2021.4.3 永久激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    529

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号