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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 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。当然根据具体业务场景还有其他解决方案。
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
11天前
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
2月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
2天前
|
NoSQL Unix Redis
Redis 键(key)
10月更文挑战第15天
7 1
|
9天前
|
缓存 监控 负载均衡
如何解决Redis热点Key问题?技术干货分享
【10月更文挑战第2天】在Redis的使用过程中,热点Key问题是一个常见的性能瓶颈。热点Key指的是那些被频繁访问的Key,它们可能导致Redis服务器的负载不均衡,进而影响整体性能。本文将深入探讨热点Key问题的成因、影响以及多种解决方案,帮助读者在实际工作中有效应对这一挑战。
18 3
|
18天前
|
NoSQL Redis
redis 的 key 过期策略是怎么实现的(经典面试题)超级通俗易懂的解释!
本文解释了Redis实现key过期策略的方式,包括定期删除和惰性删除两种机制,并提到了Redis的内存淘汰策略作为补充,以确保过期的key能够被及时删除。
37 1
|
27天前
|
存储 缓存 NoSQL
Redis 大 Key 对持久化的影响及解决方案
Redis 大 Key 对持久化的影响及解决方案
31 1
|
1月前
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
157 4
Redis中大Key与热Key的解决方案
|
1月前
|
缓存 NoSQL PHP
使用PHP-redis实现键空间通知监听key失效事件的技术与代码示例
通过上述方法,你可以有效地在PHP中使用Redis来监听键空间通知,特别是针对键失效事件。这可以帮助你更好地管理缓存策略,及时响应键的变化。
79 3
|
27天前
|
存储 缓存 NoSQL
Redis过期Key的清理机制
Redis过期Key的清理机制
38 0
|
2月前
|
存储 NoSQL Redis
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)
【Azure Developer】一个复制Redis Key到另一个Redis服务的工具(redis_copy_net8)