日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

springboot中使用RedisTemplate操作redis遇到的问题

發(fā)布時(shí)間:2025/3/19 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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í)
redisTemplate.boundValueOps("jae:springboot:user:id:1").set(users.toString(),1, TimeUnit.HOURS);

總結(jié)

以上是生活随笔為你收集整理的springboot中使用RedisTemplate操作redis遇到的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。