Spring应用用Jedis操作Redis,键带双引号致Redis Insight树形视图失效
核心问题
使用Spring RedisTemplate搭配Jedis时,插入Redis的键被双引号包裹,导致Redis Insight的树形视图无法正常识别,而此前用Node.js Redis客户端操作时无此问题。
当前配置
你的RedisTemplate配置如下:
@Bean public RedisTemplate<String, Object> redisTemplate(@Nonnull RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer()); return template; }
你尝试添加了字符串序列化器,但未解决问题:
template.setStringSerializer(new GenericToStringSerializer<>(String.class));
排查与解决思路
1. 明确RedisTemplate序列化器的作用范围
RedisTemplate的defaultSerializer会被用于键、值、哈希键、哈希值的序列化(如果没有单独设置对应序列化器)。GenericJackson2JsonRedisSerializer会将所有对象(包括字符串类型的键)序列化为JSON格式,这就是键被双引号包裹的原因——JSON字符串本身就带有引号。
而你添加的setStringSerializer仅作用于StringRedisTemplate的特定操作,对RedisTemplate的键序列化无效。
2. 为键单独配置字符串序列化器
修改RedisTemplate配置,明确指定键的序列化器为字符串类型,避免JSON序列化带来的引号:
@Bean public RedisTemplate<String, Object> redisTemplate(@Nonnull RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); // 键使用字符串序列化器 template.setKeySerializer(new StringRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); // 值使用JSON序列化器 template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; }
3. 验证Redis中的实际键值
使用redis-cli执行KEYS *命令,查看Redis中存储的键是否真的包含双引号。如果确实存在,说明是序列化问题;如果Redis中没有引号但Redis Insight显示有,可能是工具的显示bug(但这种情况概率极低)。
4. 检查哈希结构的键序列化
如果使用哈希(Hash)类型数据,确保hashKeySerializer也设置为StringRedisSerializer,否则哈希内的字段键也会被JSON序列化包裹引号,同样影响树形视图。
5. 确认操作时的键类型
确保在调用RedisTemplate的方法(如opsForValue().set("key", value))时,键参数是String类型,而非被包装成其他对象(比如不小心传入了Object类型的字符串实例,导致触发JSON序列化)。
内容的提问来源于stack exchange,提问作者laegil

