redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法

简介: redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法

redisTemplate.opsForValue().get(KEY)从Redis中取出的值为null 的解决方法

最近,博主在整理毕设时就遇到一个问题:我往Redis中存手机验证码,我把手机号当做key ,验证码当做value 存储到 Redis 中,但是在我在需要在登录操作中取验证码时遇到一个问题

困惑:

      @Resource
      private RedisTemplate<String,String> redisTemplate;
      String phone = user.getPhone();
      log.info("当前获取的手机号为:{}",phone);
      //从redis中获取手机验证码
      String userPhoneKey = redisTemplate.opsForValue().get(phone);  

783c5adedf7148c99049381d9321cd43.png我Redis 中明明存的有,但是就是取不到,显示为null。

0489c9a5bbfc4807872208cfb9572c7c.png

我调试了好久,最后在一篇文章中找到了解决方法:
其实问题表象很诡异,但问题的原因很简单,就是Redis中存数据和取数据时采用了不同的RedisTemplate导致的。
我之前的redisTemplate 的注入方法一个写的是

      一个接口上写的 @Resource
      @Resource
      private RedisTemplate<String,String> redisTemplate;
      一个接口上写的 @Autowired
      @Autowired
      private RedisTemplate<String,String> redisTemplate;
      在SpringBoot中,针对Redis的自动配置类默认会初始化两个RedisTemplate,
      初始化了两个RedisTemplate的bean。
      第一个Bean类型为RedisTemplate<Object, Object>,Bean的名称为redisTemplate,而且是当容器中不存在对应的Bean name时才会进行初始化。
      第二Bean类型为StringRedisTemplate,Bean的名称为stringRedisTemplate,
      该类继承自RedisTemplate<String, String>。
      **总结:也就说一个Bean是针对Object对象处理的,一个是针对String对象进行处理的**
      导致出现坑的原因便是set时注入的是RedisTemplate<Object, Object>,
      而获取时注入的是StringRedisTemplate。这么明显的错误应该很容易排查的
      如果直接是因为两处类型不一致导致的,的确很好排查,
      看一下注入的RedisTemplate即可。但问题难以排查,还因为另外一个因素:
      @Resource和@Autowired注入的问题。
**原因:**
      采用了@Resource注入方式,如下
      @Resource
      private RedisTemplate<String, String> redisTemplate;
      采用的是@Autowired注入的:
      @Autowired
      private RedisTemplate<String, String> redisTemplate;
      区别:
      1:当采用@Autowired时,根据类型注入,直接注入了RedisTemplate<String, String>的bean,
      因为它们的类型都是String的。
      2:当使用@Resource注入时,默认采用的是根据名称匹配,源码中可以看到
          redisTemplate对应的类型为RedisTemplate<Object, Object>。
      因此,两处注入了不同的RedisTemplate,于是就导致了获取时获取不到值的问题。

解决方法:

解决方法:
方案一,将@Resource的注入改为@Autowired。
方案二:将@Resource注入的bean名称由redisTemplate改为stringRedisTemplate。当然根据具体业务场景还有其他解决方案。
目录
相关文章
|
9月前
|
缓存 NoSQL Java
Redis应用—6.热key探测设计与实践
热key问题在高并发系统中可能导致数据层和服务层的严重瓶颈,如Redis集群瘫痪和用户体验下降。为解决此问题,京东开发了JdHotkey热key探测框架,具备实时性、准确性、集群一致性和高性能等特点。该框架由etcd集群、Client端jar包、Worker端集群和Dashboard控制台组成,通过分布式计算快速识别热key并推送至应用内存,有效减轻数据层负载,提升服务性能。JdHotkey适用于多种场景,安装部署简便,支持毫秒级热key探测和集群一致性维护。
482 61
Redis应用—6.热key探测设计与实践
|
7月前
|
存储 缓存 NoSQL
Redis中的常用命令-get&set&keys&exists&expire&ttl&type的详细解析
总的来说,这些Redis命令提供了处理存储在内存中的键值对的便捷方式。通过理解和运用它们,你可以更有效地在Redis中操作数据,使其更好地服务于你的应用。
495 17
|
6月前
|
NoSQL 测试技术 Redis
Redis批量删除Key的三种方式
Redis批量删除Key是优化数据库性能的重要操作,本文介绍三种高效方法:1) 使用通配符匹配(KEYS/SCAN+DEL),适合不同数据规模;2) Lua脚本实现原子化删除,适用于需要事务保障的场景;3) 管道批量处理提升效率。根据实际需求选择合适方案,注意操作不可逆,建议先备份数据,避免内存溢出或阻塞。
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
11月前
|
Shell
Image provider: AssetImage(bundle: null, name: “assets/images/hot.png”) Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#9d9f7(), name: “assets/images/hot.png”, scale: 1) 图像无法加载,并且其他图标图像也出错的解决方案-优雅草卓伊凡
Image provider: AssetImage(bundle: null, name: “assets/images/hot.png”) Image key: AssetBundleImageKey(bundle: PlatformAssetBundle#9d9f7(), name: “assets/images/hot.png”, scale: 1) 图像无法加载,并且其他图标图像也出错的解决方案-优雅草卓伊凡
235 12
|
11月前
|
NoSQL API Redis
在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描
通过上述步骤,可以在C程序中实现类似Redis的SCAN机制的LevelDB大规模key分批扫描。利用LevelDB的迭代器,可以高效地遍历和处理数据库中的大量键值对。该实现方法不仅简单易懂,还具有良好的性能和扩展性,希望能为您的开发工作提供实用的指导和帮助。
195 7
|
消息中间件 缓存 NoSQL
Redis 高并发竞争 key ,如何解决这个难点?
本文主要探讨 Redis 在高并发场景下的并发竞争 Key 问题,以及较为常用的两种解决方案(分布式锁+时间戳、利用消息队列)。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Redis 高并发竞争 key ,如何解决这个难点?
|
存储 监控 NoSQL
Redis大Key问题如何排查?如何解决?
Redis大Key问题如何排查?如何解决?
557 0
Redis大Key问题如何排查?如何解决?
|
NoSQL 安全 关系型数据库
2024Mysql And Redis基础与进阶操作系列(6)作者——LJS[含MySQL 多表之一对一/多;多对多;多表联合查询等详解步骤及常见报错问题所对应的解决方法]
MySQL 多表之一对一/多;多对多;多表联合之交叉连接;内连接;左、右、外、满、连接;子查询及关键字;自连接查询等详解步骤及常见报错问题所对应的解决方法

热门文章

最新文章