使用lettuce和redisTemplate操作redis cluster踩坑日记

本文记录了在虚拟机3主3从的Redis Cluster环境中,使用lettuce和spring-data-redis操作时遇到的问题。关闭master会导致读写失败,lettuce可以通过设置`ReadFrom.REPLICA_PREFERRED`优先从slave读取,解决读问题。但在spring-data-redis中,关闭master会导致重连阻塞,设置`autoReconnect(false)`可解决。由于无法直接配置从副本读,master挂掉时只能通过异常处理或消息队列应对读写失败。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:虚拟机3主3从

1、关闭slave是对读写都没有影响的

2、关键就是关闭master,读写都会失败

虽说可以设置lettuce的拓扑自动更新,但是redis的slave变成master是需要时间的
在这段时间内的读写都无法进行,异常-->【connection refused】
等到slave变成了master,读写才会恢复,但是依然会报警告,无法连接到xxx,哎...

找了半天发现有个方法可以避免读的失败,就是优先从slave读
    StatefulRedisClusterConnection对象之
    setReadFrom(ReadFrom.REPLICA_PREFERRED);
通过测试发现只有REPLICA_PREFERRED有效,其他无效
这个选项意思是优先从副本读取,master宕机或者slave宕机都不会对读造成任何影响
NICE啊。。。

3、使用lettuce操作cluster

    |--工具类

/**
 * lettuce获取cluster连接
 */
public class ClusterUtil {
    private static final List<RedisURI> redisURIList = new ArrayList<>();
    private static final String address =
                    "192.168.8.131:6379," +
                    "192.168.8.129:6379," +
                    "192.168.8.130:6379," +
                    "192.168.8.132:6379," +
                    "192.168.8.134:6379," +
                    "192.168.8.133:6379";
    private static final String auth = "******";
    private static RedisClusterClient client;
    private static ThreadLocal<StatefulRedisClusterConnection> box = new ThreadLocal<>();
    static {
        for (String x : address.split(",")) {
            StringBuilder sb = new StringBuilder();
            sb.append("redis://").append(auth).append("@").append(x);
            redisURIList.add(RedisURI.create(sb.toString()));
        }
        client = RedisClusterClient.create(redisURIList);
        //拓扑更新设置
        ClusterTopologyRefreshOptions.Builder topoBuilder = ClusterTopologyRefreshOptions.builder();
        topoBuilder.enableAllAdaptiveRefreshTriggers();
        topoBuilder.enablePeriodicRefresh(true);
        topoBuilder.dynamicRefreshSources(true);
        topoBuilder.closeStaleConnections(true);
        //client选项设置
        ClusterClientOptions.Builder clientOptionsBuilder = ClusterClientOptions.builder();
        clientOpti
使用 RedisTemplate 连接 Redis 集群需要以下步骤: 1. 在 Spring Boot 项目中添加 Redis 集群的依赖,例如 jedis lettuce。 2. 创建 Redis 集群的配置类,配置 Redis 集群的节点信息连接池信息,例如: ``` @Configuration public class RedisClusterConfig { @Bean public RedisClusterConfiguration redisClusterConfiguration() { RedisClusterConfiguration redisClusterConfiguration = new RedisClusterConfiguration(); redisClusterConfiguration.setMaxRedirects(3); redisClusterConfiguration.setClusterNodes( Set.of(new RedisNode("127.0.0.1", 7000), new RedisNode("127.0.0.1", 7001), new RedisNode("127.0.0.1", 7002), new RedisNode("127.0.0.1", 7003), new RedisNode("127.0.0.1", 7004), new RedisNode("127.0.0.1", 7005))); return redisClusterConfiguration; } @Bean public LettuceConnectionFactory lettuceConnectionFactory(RedisClusterConfiguration redisClusterConfiguration) { return new LettuceConnectionFactory(redisClusterConfiguration, LettuceClientConfiguration.builder().build()); } @Bean public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory); return redisTemplate; } } ``` 3. 使用 RedisTemplate 连接 Redis 集群,例如: ``` @Autowired private RedisTemplate<String, Object> redisTemplate; public void setValue(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getValue(String key) { return redisTemplate.opsForValue().get(key); } ``` 这样就可以使用 RedisTemplate 连接 Redis 集群了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值