Spring Boot中RedisTemplate执行HMGET返回null的问题解决
问题解决:Spring Boot Redis HMGET 返回 null 数组
核心原因
你只配置了RedisTemplate顶层的key和value序列化器,但Hash类型的**字段(Hash Key)和字段值(Hash Value)**需要单独指定序列化规则。默认情况下Spring Data Redis会使用JdkSerializationRedisSerializer处理Hash的字段和值,这和你在redis-cli中存储的纯字符串格式不兼容,导致无法匹配到对应字段,最终返回[null]。
解决办法
方法一:修改RedisTemplate配置,补充Hash序列化规则
在你的RedisConfig中,为RedisTemplate添加Hash相关的序列化器配置:
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); StringRedisSerializer stringSerializer = new StringRedisSerializer(); // 顶层Key和Value序列化 template.setKeySerializer(stringSerializer); template.setValueSerializer(stringSerializer); // 关键:添加Hash类型的字段和值序列化配置 template.setHashKeySerializer(stringSerializer); template.setHashValueSerializer(stringSerializer); return template; } }
方法二:直接使用StringRedisTemplate(更简洁)
如果你的Redis数据都是字符串类型,优先使用StringRedisTemplate——它默认全用StringRedisSerializer序列化,无需额外配置:
修改组件类
@Component public class RedisDemo { @Autowired private StringRedisTemplate stringRedisTemplate; public List<String> getHashFields(String hashKey, String... fields) { return stringRedisTemplate.opsForHash().multiGet( hashKey, Arrays.asList(fields) ); } }
修改控制器类(返回类型更准确)
@Autowired private RedisDemo redisDemo; @GetMapping("/test/{key}/{field}") public List<String> getHashFields(@PathVariable(name = "key")String key ,@PathVariable(name = "field")String field) { return redisDemo.getHashFields(key, field); }
验证
重启Spring Boot应用后,调用/test/students/andrew接口,就能得到和redis-cli一致的响应["andrew;wilson;abcSchool;900"]。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

