如何通过redis-cli查询Spring RedisTemplate存入Redis的Hash值?
问题分析与解决方法
核心原因
你看到的\xac\xed\x00\x05t\x00\x0bsomeDamn是Spring RedisTemplate默认使用JdkSerializationRedisSerializer序列化后的key,而且你用HashOperations存储的是Redis Hash结构,不是String类型,所以GET命令自然返回nil。
一、在redis-cli中查询指定版本的value
方法1:直接使用序列化后的key查询
在redis-cli中直接输入序列化后的二进制key,执行Hash查询命令:
# 注意转义序列要完整输入 HGET "\xac\xed\x00\x05t\x00\x0bsomeDamn" "urn:com.example.object-ref:version:2f7dcb42-a27d-4c9f-88d4-8721b3642792"
返回的结果是JDK序列化后的二进制数据,无法直接阅读,需要用Java代码反序列化解析。
方法2:修改RedisTemplate序列化规则(推荐)
修改Spring配置,将RedisTemplate的key和hashKey序列化器改为StringRedisSerializer,同时将value/hashValue改为JSON序列化,这样存入Redis的key和hashKey都是可读字符串:
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); StringRedisSerializer stringSerializer = new StringRedisSerializer(); // 设置key和hashKey为字符串序列化 template.setKeySerializer(stringSerializer); template.setHashKeySerializer(stringSerializer); // 设置value为JSON序列化,方便可读 Jackson2JsonRedisSerializer<Object> jsonSerializer = new Jackson2JsonRedisSerializer<>(Object.class); template.setValueSerializer(jsonSerializer); template.setHashValueSerializer(jsonSerializer); template.afterPropertiesSet(); return template; }
修改后重新存入数据,就可以直接用原始key查询:
HGET someDamn "urn:com.example.object-ref:version:2f7dcb42-a27d-4c9f-88d4-8721b3642792"
二、导出该key下的所有值
方式1:用Redis原生命令导出
如果是序列化后的key,执行以下命令导出所有Hash键值对到文件:
redis-cli HGETALL "\xac\xed\x00\x05t\x00\x0bsomeDamn" > someDamn_hash_data.txt
如果已经改成字符串序列化,直接用:
redis-cli HGETALL someDamn > someDamn_hash_data.txt
导出的文件中,序列化的数据需要Java代码反序列化,JSON序列化的数据可直接阅读。
方式2:用redis-dump工具导出(可选)
安装redis-dump工具后,可直接导出指定key的结构化数据:
# 序列化key的情况 redis-dump -k "\xac\xed\x00\x05t\x00\x0bsomeDamn" > someDamn_dump.json # 字符串序列化key的情况 redis-dump -k someDamn > someDamn_dump.json
内容的提问来源于stack exchange,提问作者Bob Kuhar
相关产品推荐
相关产品推荐

