开心一刻
昨晚和一个朋友聊天
我:处对象吗,咱俩试试?
朋友:我有对象
我:我不信,有对象不公开?
朋友:不好公开,我当的小三
问题背景
程序在生产环境稳定的跑着
直到有一天,公司执行组件漏洞扫描,有漏洞的 jar 要进行升级修复
然后我就按着扫描报告将有漏洞的 jar 修复到指定的版本
自己在开发环境也做了主流业务的测试,没有任何异常,稳如老狗
提测之后,测试小姐姐也没测出问题,一切都是这么美好
结果升级到生产后,生产日志疯狂报错: org.redisson.client.RedisException: ERR unknown command 'WAIT'
完整的异常堆栈信息类似如下

org.redisson.client.RedisException: ERR unknown command 'WAIT'. channel: [id: 0x84149c6e, L:/192.168.2.40:3592 - R:/47.98.21.100:6379] command: (WAIT), params: [1, 1000] at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:346) at org.redisson.client.handler.CommandDecoder.decodeCommandBatch(CommandDecoder.java:247) at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:189) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:117) at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:102) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:508) at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:719) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:655) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:581) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748)
突然来个这个鬼玩意,脑阔有点疼
先让运维同事回滚,然后就开始了我的问题排查之旅
问题排查与处理
项目搭建
示例代码:redisson-spring-boot-demo,执行如下 test 方法即可进行测试
项目很简单,通过 redisson-spring-boot-starter 引入 redisson
扯点题外的东西,关于 redisson-spring-boot-starter 的配置方式
配置方式有很多种,官网文档做了说明,有 4 种配置方式:README.md
方式 1:
方式 2:
方式 3:
方式 4:
如果 4 种方式都配置,最终生效的是哪一种?
楼主我此刻只想给你个大嘴巴子,怎么这么多问题?
既然你们都提出来了,那我就不能不管,谁让我太爱你们了,盘它!
从哪盘,怎么盘?
源码