场景
使用spring-boot-starter-data-redis依赖,底层使用lettuce报错。通过分析,和设置的两个超时参数又关系。由于redis服务器处理命令可以理解为单线程的形式,所以这种情况可以理解为缓存需崩。
connect-timeout-in-millis: 连接超时时间
read-timeout-in-millis: 读超时时间
这两个超时时间的配置不同,可能会导致雪崩。
举例说明
上代码,直接一brpop命令模拟,通过配置不同的超时时间,开启客户端写入数据。
一种情况: 连接超时时间(5s) < 读超时时间(6s)
这种情况下,假如一个命令阻塞时间比较长,时间超过5s,就会抛出 RedisCommandTimeoutException: Command timed out after 5 second(s) ,就会引起雪崩,这是因为假如队列中有超过 100 个命令。 头部命令还没有收到响应,而队列底部命令从同步的角度来看超时了。换个角度来说,这些超时的命令已经发送到服务器,并未从redis服务器移除。
结论
connect-timeout-in-millis,read-timeout-in-millis 这两个超时时间设置还是比较讲究,最好设置 连接超时时间 > 读超时时间,具体时间参考相关业务科学设置。
以上仅代表个人观点,如有不足,请指出。