redisTemplate.opsForValue().get(KEY)從Redis中取出的值為null 的解決方法
最近,博主在整理畢設(shè)時就遇到一個問題:我往Redis中存手機驗證碼,我把手機號當(dāng)做key ,驗證碼當(dāng)做value 存儲到 Redis 中,但是在我在需要在登錄操作中取驗證碼時遇到一個問題:
困惑:
@Resource
private RedisTemplate<String,String> redisTemplate;
String phone = user.getPhone();
log.info("當(dāng)前獲取的手機號為:{}",phone);
//從redis中獲取手機驗證碼
String userPhoneKey = redisTemplate.opsForValue().get(phone);
我Redis 中明明存的有,但是就是取不到,顯示為null。
我調(diào)試了好久,最后在一篇文章中找到了解決方法:
其實問題表象很詭異,但問題的原因很簡單,就是Redis中存數(shù)據(jù)和取數(shù)據(jù)時采用了不同的RedisTemplate導(dǎo)致的。
我之前的redisTemplate 的注入方法一個寫的是:文章來源:http://www.zghlxwxcb.cn/news/detail-507855.html
一個接口上寫的 @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,而且是當(dāng)容器中不存在對應(yīng)的Bean name時才會進行初始化。
第二Bean類型為StringRedisTemplate,Bean的名稱為stringRedisTemplate,
該類繼承自RedisTemplate<String, String>。
**總結(jié):也就說一個Bean是針對Object對象處理的,一個是針對String對象進行處理的**
導(dǎo)致出現(xiàn)坑的原因便是set時注入的是RedisTemplate<Object, Object>,
而獲取時注入的是StringRedisTemplate。這么明顯的錯誤應(yīng)該很容易排查的
如果直接是因為兩處類型不一致導(dǎo)致的,的確很好排查,
看一下注入的RedisTemplate即可。但問題難以排查,還因為另外一個因素:
@Resource和@Autowired注入的問題。
**原因:**
采用了@Resource注入方式,如下
@Resource
private RedisTemplate<String, String> redisTemplate;
采用的是@Autowired注入的:
@Autowired
private RedisTemplate<String, String> redisTemplate;
區(qū)別:
1:當(dāng)采用@Autowired時,根據(jù)類型注入,直接注入了RedisTemplate<String, String>的bean,
因為它們的類型都是String的。
2:當(dāng)使用@Resource注入時,默認采用的是根據(jù)名稱匹配,源碼中可以看到
redisTemplate對應(yīng)的類型為RedisTemplate<Object, Object>。
因此,兩處注入了不同的RedisTemplate,于是就導(dǎo)致了獲取時獲取不到值的問題。
解決方法:文章來源地址http://www.zghlxwxcb.cn/news/detail-507855.html
解決方法:
方案一,將@Resource的注入改為@Autowired。
方案二:將@Resource注入的bean名稱由redisTemplate改為stringRedisTemplate。當(dāng)然根據(jù)具體業(yè)務(wù)場景還有其他解決方案。
到了這里,關(guān)于redisTemplate.opsForValue().get(KEY)從Redis中取出的值為null 的解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!