windows下springboot 集成redis时遇到的问题总结

springboot 集成redis时遇到的问题总结

SpringBoot版本:2.2.7.RELEASE

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 引入依赖,在配置文件中简单配置后,在测试类中注入RedisTemplate,进行简单的get/set测试,结果报了连接超时的错误。

    • 先修改了配置文件中的timeout属性,修改到5000后仍然报这个错误

    • 检查redis服务是否开启,重启后,重新运行程序,问题解决。

    • Jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用Jedis pool 连接池 ! 更像BIO模式

      lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据了,更像NIO模式

  2. 基于在命令行窗口查看数据的乱码问题,重写了RedisTemplate,将其@Bean注入,在测试运行时报错Error creating bean with name ‘redisTemplate’ defined in class path resource…

    • 查看底层可以发现spring boot中redis使用的时lettuce,而非之前的jedis,故将方法的参数类型从RedisConnectionFactory改为LettuceConnectionFactory。

    • 导入依赖

      <dependency>
          <groupId>org.apache.commons</groupId>
          <artifactId>commons-pool2</artifactId>
      </dependency>
      
  3. 关于Java实现bRPop,lRPop时遇到的问题

    关于List的操作都在redisTemplate.opsForList(). 然而在使用的过程中并没有找到,最终在RedisConnection 下找到该方法。

    使用方法:

    RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
    List<byte[]> list = connection.bRPop(5, "list1".getBytes(), "list2".getBytes());
    

    问题:我需要获取的是这个方法每次弹出的值,故需要它的返回值。从命令行窗口执行结果来看,返回的应该是
    在这里插入图片描述

    代码中返回的list中应该有两个元素,分别为key和value。

  4. 配置redis集群时改完配置文件后也无法同时开启多个服务,每次显示的还是6379

解决:

安装服务:redis-server.exe --service-install D:/redis_cluster/redis6381/redis.windows.conf --service-name redis6381

开启服务:D:\redis_cluster\redis6381>redis-server.exe --service-start --service-name redis6381

配置文件最好使用完整路径,否则重启Redis集群会出现问题

  • 配置完所有的端口服务后,利用redis-cli -p 6381命令启用客户端,直接打卡redis-lic.exe时默认连接的还是6379.

  • 配置主机和从机:由于默认情况下,每台服务器都是主机,故只用配置从机。

    利用info replication命令查看服务状态

在这里插入图片描述

配置从机可选命令行和配置文件两种方式,但要永久性改变,则选择配置文件,配置文件中配置slaveof属性,同时在这里我遇到一个坑:由于我配置的各个端口的服务是参照网上大多数的配置方法,其中将每个端口的配置文件中的cluster-enabled yes,会报错 slaveof directive not allowed in cluster mode,故改为cluster-enabled no,后成功启动从机。

在这里插入图片描述

  1. (error) CLUSTERDOWN Hash slot not served

这里主要需要区分的是集群模式和哨兵模式的区别,我理解的是哨兵模式是集群模式的实现方式之一,之所以会出现这样的报错,主要是由于我配置的是哨兵模式,而非redis帮我们集成好的集群模式,我混淆了两种方案所导致的。故我修改为单纯的哨兵模式。

开启哨兵:redis-server.exe sentinel6379.conf --sentinel

将哨兵服务安装为windows服务

修改为单纯的哨兵模式。

开启哨兵:redis-server.exe sentinel6379.conf --sentinel

将哨兵服务安装为windows服务

redis-server --service-install sentinel6381.conf --sentinel --service-name RedisSentinel6381 --port 26381


版权声明:本文为weixin_42262618原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。