如何简单地实现易用的ShardedJedisSentinelPool

本文介绍了如何简单地实现一个自定义的ShardedJedisSentinelPool,以同时支持Redis的分片和哨兵机制。通过创建JedisSentinelPool数组,每个池对应一个主备Redis服务节点,并使用一致性哈希来确定从哪个池获取Jedis实例。当Redis主节点故障时,哨兵集群能够自动切换,确保高可用性。一致性哈希算法通过为每个JedisShardInfo分配160个虚拟节点,根据key的哈希值找到对应的服务节点信息,从而实现平滑的节点迁移。
摘要由CSDN通过智能技术生成

Jedis包中有个很恶心的问题,那就是包里面有支持分片的ShardeJedis客户端类,也有支持哨兵的池类JedisSentinelPool,就是没有既支持分片又支持哨兵的池类,所以必须自己自定义一个ShardedJedisSentinelPool,定义这个类,在网上有个很受欢迎的版本,是继承了Pool<ShardeJedis>类后重写相关的池操作的方法,个人觉得这种方案太麻烦,而且据反馈也有很多考虑不全面的细节,造成bug。一开始我试图去继承JedisSentinelPool类并重写相关方法把分配功能加进去,发现很难搞。后来改变了思路,其实可以建立一个JedisSentinelPool数组,每个元素其实对应监视一个主备的redis服务节点,然后可以根据分片规则去确定从哪个JedisSentinelPool中获取jedis。这个方案比较简单实用,唯一难点就是要去实现跟ShardeJedis一样的一致性哈希分片规则。好在sharde.java中有相关源码,只要稍作修改即可。实现源码如下:

public class ShardedJedisSentinelPool {
private Map<String,JedisSentinelPool> poolMap = new HashMap<String,JedisSentinelPool>();
private Hashing algo = Hashing.MURMUR_HASH;
private TreeMap<Long, JedisShardInfo> nodes;

public ShardedJedisSentinelPool(Set<HostAndPort> hostInfo, Set<String> sentinels){
List<JedisShardInfo> list = new ArrayList<JedisShardInfo>();
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值