springboot 集成redis时遇到的问题总结
SpringBoot版本:2.2.7.RELEASE
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
引入依赖,在配置文件中简单配置后,在测试类中注入RedisTemplate,进行简单的get/set测试,结果报了连接超时的错误。
先修改了配置文件中的timeout属性,修改到5000后仍然报这个错误
检查redis服务是否开启,重启后,重新运行程序,问题解决。
Jedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用Jedis pool 连接池 ! 更像BIO模式
lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据了,更像NIO模式
基于在命令行窗口查看数据的乱码问题,重写了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>
关于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。
配置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,后成功启动从机。

- (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