SpringBoot中RedisTemplate操作Redis时值为Null的问题修复咨询
修复Redis存入值为Null的问题
问题根源
当前代码的核心逻辑完全错误:
putCache方法里先尝试从Redis读取指定key的值,但这个key还没被存入任何数据,所以value必然是null- 随后你把这个
null值存入Redis的Hash结构,最终导致Redis里的值全为null - 调用
putCache时仅传入了分类编码,根本没把从数据库获取的SpriteEntity业务数据传进去
修复方案
1. 重构putCache方法
调整方法参数,接收实际要存入的业务数据,不再读取Redis中不存在的值:
public void putCache(String categoryCode, String subCategoryCode, String value) { // 用主分类编码作为Hash的键,子分类编码作为Hash的字段,更符合Hash的使用场景 String hashKey = REDIS_KEY + categoryCode; redisTemplate.opsForHash().put(hashKey, subCategoryCode, value); }
2. 修改调用逻辑,传入数据库的实际数据
在spriteGetData中,从SpriteEntity取出需要缓存的业务数据(比如实体的JSON字符串,或某个具体字段),再调用putCache:
public void spriteGetData() { List<SpriteEntity> spriteEntities = spriteRepo.findAll(); for (SpriteEntity entity : spriteEntities) { String categoryCode = entity.getCategoryCode(); String subCategoryCode = entity.getSubCategoryCode(); // 示例:将实体转为JSON字符串存入,你可以替换为实际需要的字段(如entity.getSpriteName()) String cacheValue = objectMapper.writeValueAsString(entity); redisService.putCache(categoryCode, subCategoryCode, cacheValue); } }
额外检查项
- 确保
objectMapper已正确注入(若用JSON序列化) - 确认
redisTemplate的连接配置正常,能正常访问Redis服务 - 若需要缓存过期,可在存入后添加
redisTemplate.expire(hashKey, 2, TimeUnit.HOURS)这类设置过期时间的逻辑
内容的提问来源于stack exchange,提问作者sprite15400
相关产品推荐
相关产品推荐

