添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
威武的灯泡  ·  NEW3DSLL N...·  1 月前    · 
非常酷的皮蛋  ·  如何通过Excel ...·  2 月前    · 
温柔的烤红薯  ·  Ability to not use ...·  3 月前    · 

spring boot整合redis集群

最近的一个个人项目中使用到redis集群,redis集群的搭建环境使用同一台虚拟机,创建集群的命令是

redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

具体如何创建redis集群可以看我另一篇文章

以上是背景描述。下面先讲一下如何在spring boot 中连接redis集群。

首先引入redis starter 的pom依赖,版本信息可以自行添加。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

然后再配置中添加对应redis集群的节点信息。

#redis集群连接配置
spring.redis.cluster.nodes=192.168.0.15:6379,192.168.0.15:6380,192.168.0.15:6381,192.168.0.15:6382,192.168.0.15:6383,192.168.0.15:6384

到了这里就已经完成配置,其他的连接redis集群的操作,都由spring boot替我们完成,在使用的时候只需要依赖注入RedisTemplate就可以。

然而就在我以为确实是这样的时候,却发现程序在启动的时候一致报错。

配置正确,启动报错

报错信息很简单,关键部分如下所示。

io.lettuce.core.RedisConnectionException: Unable to connect to 127.0.0.1:6380
......

上面的描述基本上就是无法连接到redis节点,但是为什么呢?我的配置中的信息明明是正确的。按道理不应该报错。于是百度一番,但是很难找不到我这种情况。

仔细查看错误信息,发现是在我程序中一个@PostConstruct方法执行时,利用redisTemplate进行设置一个

redisTemplate.opsForValue().set

操作报错。根据这一点,跟踪代码。

调试,查看redisTemplate中的连接信息,如下图所示。确实是我的配置信息。但是在执行set的时候确实是报错。

没办法只能跟踪以下set的方法调用,分析连接信息是在什么时候改变的。

最终发现了问题所在,连接信息确实会在某一时刻被改变,方法如下

  • io.lettuce.core.cluster.RedisClusterClient#loadPartitions
protected Partitions loadPartitions() {
    Iterable<RedisURI> topologyRefreshSource = getTopologyRefreshSource();
    String message = "Cannot retrieve initial cluster partitions from initial URIs " + topologyRefreshSource;
    try {
        //分别从每个redis节点获取集群信息
        Map<RedisURI, Partitions> partitions = refresh.loadViews(topologyRefreshSource, useDynamicRefreshSources());
        if (partitions.isEmpty()) {
            throw new RedisException(message);
        //从每个节点获得的集群信息中重新决定一份节点连接信息
        Partitions loadedPartitions = determinePartitions(this.partitions, partitions);
        RedisURI viewedBy = refresh.getViewedBy(partitions, loadedPartitions);
        for (RedisClusterNode partition : loadedPartitions) {
            if (viewedBy != null) {
                RedisURI uri = partition.getUri();
                RedisClusterURIUtil.applyUriConnectionSettings(viewedBy, uri);
        activateTopologyRefreshIfNeeded();
        return loadedPartitions;
    } catch (RedisConnectionException e) {
        throw new RedisException(message, e);

这个方法是遍历集群节点配置,然后连接每个节点,分别从每个redis节点获取集群信息,获得的信息如下。

上面这张图,不看别的,就看从6379这个端口的节点获取的集群信息,除了6379本身,其他的全是127.0.0.1,然后后面经过determinePartitions方法,选出一个127.0.0.1的节点连接也就不出为奇了。

那么到底是什么造成上面的情况?分析了一下,执行以下命令

redis-cli --cluster check 127.0.0.1:6379

得到集群信息,是127.0.0.1的连接信息,试想一下,如果java程序连接redis时,获取集群信息是不是也是这样,那么就可以解释为何连接是程序获得的节点连接是127.0.0.1了。

127.0.0.1:6379 (48d62570...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:6381 (842f698d...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:6380 (fdfb3bea...) -> 0 keys | 5462 slots | 1 slaves.

上面知道了问题所在就好办了,我们只需要在创建集群的时候,不要使用127.0.0.1,要使用我们机器能访问到的ip地址,例如我的虚拟机ip是192.168.0.15,所以重新建立redis集群,将一开始的创建命令改为以下方式。

redis-cli --cluster create 192.168.0.15:6379 192.168.0.15:6380 192.168.0.15:6381 192.168.0.15:6382 192.168.0.15:6383 192.168.0.15:6384 --cluster-replicas 1

重新创建集群后,重新启动程序,正确启动,ok!!!

spring boot整合redis集群最近的一个个人项目中使用到redis集群,redis集群的搭建环境使用同一台虚拟机,创建集群的命令是redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-r...
虽然EhCache已经能够适用很多应用场景,但是由于EhCache是进程内的缓存框架,在集群模式下时,各应用服务器之间的缓存都是独立的,因此在不同服务器的进程间会存在缓存不一致的情况。即使EhCache提供了集群环境下的缓存同步策略,但是同步依然需要一定的时间,短暂的缓存不一致依然存在。 在一些要求高一致性(任何数据变化都能及时的被查询到)的系统和应用中,就不能再使用EhCache来解决了,这个时候使用集中式缓存是个不错的选择,因此本文将介绍如何在Spring Boot的缓存支持中使用Redis进行数据缓存。
springboot+redis哨兵集群的yml配置 Cannot retrieve initial cluster partitions from initial URIs
使用redis3.2.8 建立集群后,发现在连接redis 经常报连接失败。但是单独连接某个节点时,是不会报错的,经过分析终于发现了原因。 原因是这样的:我在建立集群的时候配置文件redis.conf 中 bind 127.0.0.1 192.168.6.24 在使用命令:./redis-trib.rb create --replicas 1 192.168.6.24:7000 19...
前一篇提到了容器ip变化后集群自发现的问题,现在接着讲这个问题引申出的另两个问题: 1.虽然集群ip问题解决了,但java client还是连接报错,似乎连的是老的ip地址。 2.当key所在的master挂了,slave切换到master后,java客户端却一直尝试重连,直到超时,并没有随着master的切换去连主拿key。以下代码和例子为环境模拟。 集群信息: https://github.com/lettuce-io/lettuce-core https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster 1.Redis Cluster
记个链接:https://www.cnblogs.com/ryanzheng/p/8075221.html 用了redis集群,所以不仅要起三个端口的redis服务,还要把三个集群连起来: 1, 起了集群的不能只用一个node,不然报错: spring.redis.cluster.nodes=localhost:6379 org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Re..
docker run -d --name redis7000 -p 7000:6379 redis docker run -d --name redis7001 -p 7001:6379 redis docker run -d --name redis7002 -p 7002:6379 redis # 进入redis容器 docker exec -it redis7000 bash redis-cli package test; import org.apache.com
可以使用Spring Data Redis来实现Spring Cache与Redis集群整合。具体实现可以参考以下步骤: 1. 在pom.xml中添加Spring Data RedisRedis客户端的依赖。 2. 配置Redis集群连接信息,可以使用RedisClusterConfiguration类来实现。 3. 创建RedisConnectionFactory对象,可以使用JedisConnectionFactory类来实现。 4. 创建RedisTemplate对象,可以使用StringRedisTemplate类来实现。 5. 在需要使用缓存的方法上添加@Cacheable注解,并指定缓存的名称和缓存的key。 6. 在需要清除缓存的方法上添加@CacheEvict注解,并指定缓存的名称和缓存的key。 7. 在需要更新缓存的方法上添加@CachePut注解,并指定缓存的名称和缓存的key。 以上就是整合Spring Cache与Redis集群的基本步骤,具体实现可以参考Spring官方文档或者相关的博客文章。