springboot中使用RedisTemplate操作redis遇到的问题
生活随笔
收集整理的這篇文章主要介紹了
springboot中使用RedisTemplate操作redis遇到的问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先說說問題,
在springboot中使用RedisTemplate操作redis時(shí)候,通過redis工具發(fā)現(xiàn)存入redis的數(shù)據(jù)的鍵為空
,如下圖:點(diǎn)擊空的鍵,彈出錯(cuò)誤提示:不能打開值的標(biāo)簽,不能加載key,因?yàn)樗?key)不存在數(shù)據(jù)庫(kù)中,請(qǐng)重新加載連接,如圖:
通過黑窗口查看redis中的鍵,發(fā)現(xiàn)存儲(chǔ)在redis中的key不是設(shè)置的string值,前面還多出了許多類似\xac\xed\x00\x05t\x00
操作redis的代碼如下:
@Service public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic List<User> findAll() {// 首先判斷緩存中是否有數(shù)據(jù) List<User> users = (List<User>) redisTemplate.boundValueOps("jae:springboot:user:id:1").get();if (users==null) {System.out.println("load from db");// 從數(shù)據(jù)庫(kù)中查詢users = userMapper.findAll();// 放入緩存redisTemplate.boundValueOps("jae:springboot:user:id:1").set(users);}else {System.out.println("load from redis");} /*// 方便即存即刪redisTemplate.delete("jae:springboot:user:id:1"); */return users;} }spring-data-redis的RedisTemplate<K, V>模板類在操作redis時(shí)默認(rèn)使用JdkSerializationRedisSerializer來進(jìn)行序列化,如下
private boolean enableDefaultSerializer = true;private RedisSerializer<?> defaultSerializer = new JdkSerializationRedisSerializer();private RedisSerializer keySerializer = null;private RedisSerializer valueSerializer = null;private RedisSerializer hashKeySerializer = null;private RedisSerializer hashValueSerializer = null;解決辦法:在代碼中,將RedisTemplate 注入改成如下代碼
private RedisTemplate redisTemplate;@Autowired(required = false) public void setRedisTemplate(RedisTemplate redisTemplate) {RedisSerializer stringSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringSerializer);redisTemplate.setValueSerializer(stringSerializer);redisTemplate.setHashKeySerializer(stringSerializer);redisTemplate.setHashValueSerializer(stringSerializer);this.redisTemplate = redisTemplate; }一般到這里問題差不多可以解決了,但是我是存對(duì)象的集合,運(yùn)行的時(shí)候報(bào)了一個(gè)類型轉(zhuǎn)換異常,list不能轉(zhuǎn)string,因此我將存入redis的user對(duì)象toString,問題得到解決。
優(yōu)化redis操作:
- 如果你的pojo沒有重寫toString方法,這時(shí)候redis中存的值為對(duì)象的地址值,如果需要在redis中展示結(jié)果(非地址值),pojo重寫toString即可
- 可以給存入redis的數(shù)據(jù)設(shè)置過期時(shí)間,即使我們?cè)趓edis中看不見對(duì)應(yīng)的數(shù)據(jù),無法刪除,但是我們還是可以通過redis的過期時(shí)間自動(dòng)清除記錄,下面示例為 設(shè)置過期時(shí)間是1小時(shí)
總結(jié)
以上是生活随笔為你收集整理的springboot中使用RedisTemplate操作redis遇到的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea 往 Github 上 push
- 下一篇: linux cmake编译源码,linu