- 浏览: 46638 次
最新评论
由于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<String> keys(JedisCluster jedisClusterClient, String cachePrefix) { Map<String, JedisPool> clusterNodes = jedisClusterClient.getClusterNodes(); TreeSet<String> 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<String> 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首选使用本方法 * <br/> * <br/> * hash tags在redis集群reSharding时,不能保证都在同一slot下,所以为代码健壮性考虑可首先调用本方法再捕获异常中调用{@link #delLoopNodesByPrefix(JedisCluster, String)}方法处理 * @param jedisClusterClient * @param cachePrefix */ static void delAllByPrefix(JedisCluster jedisClusterClient, String cachePrefix) { Set<String> 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<String, JedisPool> 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<String> keys = jedis.keys(keysPattern); if (keys.size() <= 0) continue; Map<Integer, List<String>> 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()])); } } } } }
发表评论
-
简单的压测模拟
2018-05-11 19:52 669import java.time.Duration; i ... -
Java的驼峰与下划线的属性对象互相转换
2018-05-11 19:50 8421import com.xxxx.util.consta ... -
Elastic Search搜索实例
2019-06-16 18:30 636要从现在的公司离职了。记录一下自己针对我们的自己需求所做的搜索 ... -
针对基于Redis Cluster的接口数据缓存删除实现
2018-03-26 10:35 1237首先定义个工具interface,基于Java 8的实现. 主 ... -
简单ELK配合logback搭建日志监控中心
2018-03-20 17:30 1340今天得闲就自己搭了个ELK示例,过程挺简单的。 Elas ... -
spring的基于java的项目配置示例2
2018-03-20 17:32 847import com.xxx.support.config ... -
HttpClient实例
2018-03-16 08:15 656import java.io.IOException; ... -
spring的基于java的项目配置示例1
2018-03-16 08:26 936spring的基于java的项目配置示例。 impor ... -
基于spring data的Elastic Search的配置示例
2018-03-15 17:41 911基于spring data的Elastic Search的配置 ... -
爬虫基础类
2018-03-15 17:28 807自己封装的爬虫基础类。 public interfac ... -
基于AOP的ajax的referrer判断
2018-03-15 17:23 1561网页中ajax请求的referrer的值是当前域名。(其实这个 ... -
Java Timestamp从MySQL数据库取出的字符串转换为LocalDateTime
2016-01-26 16:08 9927最新在工作中使用了Java 8的LocalDate ... -
reviewC指针
2014-03-02 22:05 372由于要考试,有C的考核内容。所以今天把C拉出来又看了下,其实基 ... -
Python2.X内置函数学习
2013-12-19 21:52 11641.apply()函数 学过Python的都知道P ... -
学习Python中遇到的问题
2013-09-04 23:26 718最近学习Python中。 先上代码: # -*- codi ...
相关推荐
1. **集群初始化**:使用 `JedisCluster` 类,并提供集群节点信息。 ```java Set<HostAndPort> nodes = new HashSet(); nodes.add(new HostAndPort("host1", port1)); nodes.add(new HostAndPort("host2", port2));...
适用于redis集群,3.0版本以上支持集群
本文将深入探讨如何在Java框架中使用Jedis来操作Redis,包括单机版和集群版的设置,以及如何设计一个通用的接口工具类。 首先,让我们了解Java中的Jedis。Jedis提供了丰富的API,可以执行Redis的各种命令,如设置和...
为了方便地在Java应用中操作Redis,开发者通常会创建一个工具类(Util),封装各种Redis操作方法。这个"java操作redis工具类"就是这样的一个实用组件,它简化了与Redis服务器的交互,使得代码更简洁、易维护。 首先...
这个压缩包文件"jedisclient.rar"包含了对Jedis客户端的工具类实现,方便开发者在单机版和集群环境下快速接入和使用Redis服务。 1. **JedisClient**: 这个工具类是对Jedis原生API的封装,简化了与Redis服务器的交互...
JedisCluster是Jedis库提供的一个类,用于连接和操作Redis集群。在SpringBoot中,我们可以通过配置`application.yml`或`application.properties`文件来设置JedisCluster的相关参数。以下是一个基本的YAML配置示例: ...
Java调用Redis工具类Jedis是Java开发人员在与Redis进行数据交互时常用的库。Redis是一个高性能的键值存储系统,常被用作数据库、缓存和消息中间件。Jedis是Java语言的一个轻量级Redis客户端,它提供了丰富的API来...
【Redis集群连接及工具类DEMO】是一个Spring工程,它提供了与Redis集群交互的实例,同时也包含了一些实用的工具类,使得开发者能够更方便地在Java应用中使用Redis作为数据存储。这个DEMO的主要目标是展示如何配置和...
`jedis.zip`包含的工具类是为了简化Java程序员与Redis服务器之间的交互,使得操作Redis更加便捷。下面我们将详细探讨这两个关键的类:`JedisTemplate`和`JedisProvider`。 `JedisTemplate`是核心的模板类,它封装了...
包含三个类JedisClient.java; JedisClientCluster.java ;JedisClientPool.java,不用自己手动写连接池,调用类中的函数,传入相关参数即可完成连接Redis
6. **其他特性**:还包括pipeline(批量处理命令,减少网络延迟)、sentinel支持(监控和故障转移)、集群支持(JedisCluster)等。 **导入和使用Jedis-2.9.0.jar** 在Java项目中,引入Jedis-2.9.0.jar包后,可以...
6. **Cluster支持**:Jedis提供了对Redis Cluster的全面支持,可以方便地在分布式环境中操作多个Redis节点。 7. **错误处理**:在Jedis 3.0中,错误处理更加明确和一致,有助于开发者快速定位和解决问题。 使用这...
在Java开发中,为了方便地与Redis交互,我们通常会编写或使用已有的Redis工具类。这个“Redis工具类”就是为了简化Redis的读写操作而设计的,它能够帮助开发者更高效、更便捷地在应用程序中集成Redis功能。 Redis...
在Spring应用中,可以使用`JedisCluster`类来操作Redis集群。 1. **依赖引入**:在项目中添加Spring-data-redis和Jedis的相关依赖。 2. **配置**:在Spring的配置文件中定义`JedisCluster`的bean,设置集群节点地址...
通过`JedisCluster`类连接到集群,内部会自动处理槽位分配和节点间通信。 8. **异常处理** - Jedis操作过程中可能会遇到各种异常,如`JedisConnectionException`表示连接问题,`RedisException`是通用的Redis异常...
6. **集群支持**:Jedis 2.7.2版本已经包含了对Redis Cluster的基本支持,可以通过`JedisCluster`类与Redis集群进行交互,自动处理槽位分配和故障转移。 7. **命令行接口模拟**:Jedis的设计使得开发者能够轻松地将...
4. 初始化Jedis实例:在`JedisUtil`或类似工具类中,根据配置创建Jedis或JedisCluster实例。 5. 实现业务逻辑:在需要使用Redis的地方,通过工具类调用相应的Jedis方法完成操作,如存取数据、执行命令等。 6. 序列化...
- Jedis 3.6.0版本改进了对Redis集群的支持,通过`JedisCluster`类可以方便地在集群环境中操作数据。 9. **过期时间与持久化**: - 可以设置键的过期时间,通过`expire`和`ttl`方法,同时Jedis也支持对Redis的RDB...
`JedisCluster`类提供了与单节点Jedis类似的方法,但能自动处理槽分配和节点间的通信。 7. **命令行工具模拟**:Jedis的设计灵感来自于Redis的命令行工具`redis-cli`,因此它的API设计尽可能接近Redis命令,方便...