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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android Studio新手教程「建议收藏」

    Android Studio新手教程「建议收藏」AndroidStudio下载选择从AndroidStudio中文组官网进行下载:http://www.android-studio.org/如果电脑网络好,能翻墙的,可以直接从官网首页推荐的google正版链接进行下载,如:android-studio-ide-173.4720617-windows.exeRecommended如果网络不好下载失败,则可以从官方提供的百度网盘方式进行下载:http://www.android-studio.org/index.php/downloa

    2022年4月27日
    69
  • HDCVI——一种创新性的高清视频传输方案

    HDCVI——一种创新性的高清视频传输方案什么是HDCVI   2012年11月,大华技术股份有限公司发布了具有自主知识产权的同轴高清传输接口技术HDCVI。HDCVI技术是一种基于已有SYV75-3或SYV75-5同轴电缆的高清视频传输方法,能够在低成本和较低质量的同轴电缆上实现超长距离高清视频信号的可靠传输。相比较HD-SDI子系统在实际应用中对传输介质的高要求,HDCVI可以适应长距离、低成本的传输介质以及复杂的部署场合。

    2022年10月4日
    2
  • python fileinput_Python中fileinput模块

    python fileinput_Python中fileinput模块fileinput模块可以对一个或多个文件中的内容进行迭代、遍历等操作。该模块的input()函数有点类似文件readlines()方法,区别在于:前者是一个迭代对象,即每次只生成一行,需要用for循环迭代。后者是一次性读取所有行。在碰到大文件的读取时,前者无疑效率更高效。用fileinput对文件进行循环遍历,格式化输出,查找、替换等操作,非常方便。【典型用法】importfileinputf…

    2022年6月6日
    30
  • 2022年idea激活码[最新免费获取]

    (2022年idea激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月22日
    191
  • 自动化测试平台(四):前端环境搭建

    自动化测试平台(四):前端环境搭建上一章节我们实现了用户模块的增删改查接口,现在有了接口了就需要开始开发前端页面对其进行展示交互了。现在越来越多的前端开发框架和UI组件让我们能够更容易迅速的去开发前端页面,这一章节将通过react(Web开发框架)+antd(UI组件库)+ts(Javascript的超集)的技术栈来搭建我们的前端项目。

    2022年6月16日
    41
  • 什么是泛型,怎么使用泛型分析

    什么是泛型,怎么使用泛型分析1、泛型1:什么是泛型?泛型就是广泛的类型,也是一种数据类型,而这种数据类型可以是任意类型,编写过程中当中不能确定类型,创建对象时必须指定具体类型,不指定也可以,但是会出现一些错误。泛型是编译器行为,只能在编译期有效,如果能够跨过编译器,那么泛型就没有任何意义了。2、泛型类怎么定义泛型类?在类后面加<&g…

    2022年6月22日
    38

发表回复

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

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