Redis缓存访问异常排查:ERR Protocol error: invalid bulk length
解决Redis缓存访问时随机出现的"ERR Protocol error: invalid bulk length"异常
首先贴出异常信息:
redis.clients.jedis.exceptions.JedisDataException: ERR Protocol error: invalid bulk length org.springframework.dao.InvalidDataAccessApiUsageException: ERR Protocol error: invalid bulk length; nested exception is redis.clients.jedis.exceptions.JedisDataException: ERR Protocol error: invalid bulk length at org.springframework.data.redis.connection.jedis.jedisExceptionConverter.convert(JedisExceptionConverter.java:69)
以下是针对性的排查和解决方向:
版本兼容性问题
老版本Jedis客户端与新版本Redis服务器之间可能存在协议不兼容情况,导致数据包解析出错。建议将Jedis升级到与Redis服务器版本匹配的稳定版:比如Redis 6.x+对应Jedis 3.x及以上,Redis 7.x建议使用Jedis 4.x版本。连接池配置异常
连接池中的连接如果被复用后处于异常状态,会引发协议错误。调整连接池配置,确保获取的连接可用:- 开启
testOnBorrow和testOnReturn参数,在借取和归还连接时验证连接状态 - 合理设置
maxIdle、minIdle值,避免连接长时间闲置失效
示例Spring配置代码:
@Bean public JedisPoolConfig jedisPoolConfig() { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(20); config.setMinIdle(5); config.setTestOnBorrow(true); config.setTestOnReturn(true); return config; }- 开启
网络链路问题
网络波动、丢包或者中间代理(如Nginx、HAProxy)会导致Redis协议包损坏,引发解析错误。- 检查服务器与Redis节点之间的网络稳定性,排查是否有丢包、延迟过高情况
- 若使用代理,尝试绕过代理直接连接Redis测试,确认是否是代理导致的问题
- 给Jedis客户端配置合理的超时时间和重试机制,避免因网络超时引发异常
序列化/反序列化错误
缓存数据在序列化过程中出现损坏,会导致Redis返回异常的数据包。- 检查自定义序列化器的实现,确保能正确处理空值、特殊字符和复杂对象
- 若使用Spring默认序列化,建议替换为Jackson2JsonRedisSerializer这类更可靠的序列化方式,示例配置:
@Bean public RedisSerializer<Object> redisSerializer() { Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(om); return serializer; }Redis服务器状态异常
Redis服务器内存不足、CPU负载过高时,可能无法正确处理请求,导致协议响应错误。- 执行
INFO memory命令检查内存使用情况,若内存不足,调整缓存过期策略或扩容内存 - 执行
INFO stats查看服务器负载,排查是否有慢查询或突发流量导致服务器压力过大
- 执行
内容的提问来源于stack exchange,提问作者GSSA
相关产品推荐
相关产品推荐

