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()]));

}

}

}

}

}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • linux kworker进程占用cpu,为什么kworker cpu使用率如此之高?

    linux kworker进程占用cpu,为什么kworker cpu使用率如此之高?问题描述我最近在我的三星笔记本电脑和Windows7上安装了Ubuntu12.04。每当我使用Ubuntu(即使它闲置)时,kworker几乎占用了8核之一的90%。虽然它并没有真正影响我的使用,但它让我感到烦恼,我担心它可能会损害我的处理器。我甚至尝试安装另一个Linux发行版(LinuxMint),而kworker也引发了同样的问题。所以我不知道该怎么办。我将衷心感谢您的帮助。最佳解决方…

  • vmware虚拟机安装linux系统_虚拟机的配置

    vmware虚拟机安装linux系统_虚拟机的配置VMware安装与配置Linux虚拟机

  • 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备

  • 自定义 DataLoader[通俗易懂]

    自定义 DataLoader[通俗易懂]自定义DataLoader如数据输入一文所介绍,OneFlow支持两种数据加载方式:直接使用NumPy数据或者使用DataLoader及其相关算子。在大型工业场景下,数据加载容易成为训练的瓶颈。在其它的框架中,数据加载流水线往往作为单独的模块存在,需要针对不同场景进行调整,通用性不高。在OneFlow中,DataLoader及相关预处理算子,与其它普通算子地位等同,可以享受与其它算子一样的流水加速效果,轻松解决大规模数据加载的痛点。在OneFlow中使用DataLoader

  • 设置eclipse代码自动补全功能

    设置eclipse代码自动补全功能1.选择Eclipse菜单条中的Windows菜单下的Preferences项2.在左侧找到“Java”->“Editor”->“ContentAssist”3.在右侧“AutoActivation”项目下找到“AutoactivationtriggersforJava:”(可以看到设置框中默认的只有“.”,这就是为什么默认只有点“.”可以触发自动补全…

  • linux 命令chmod 755的意思[通俗易懂]

    linux 命令chmod 755的意思[通俗易懂]chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限。 一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文件所有者同属一个用户组的其他用户的权限第三个数字表示其它用户组的权限。      权限分为三种:读(r=4),写(w=2),执行(x=1)。综合起来还有可读可执行(rx=5=4+1)、可读可写(rw=6=4+2)、可读可写可执行(…

发表回复

您的电子邮箱地址不会被公开。

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