springboot中使用RedisTemplate操作redis遇到的问题
生活随笔
收集整理的這篇文章主要介紹了
springboot中使用RedisTemplate操作redis遇到的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先說說問題,
在springboot中使用RedisTemplate操作redis時候,通過redis工具發現存入redis的數據的鍵為空
,如下圖:點擊空的鍵,彈出錯誤提示:不能打開值的標簽,不能加載key,因為它(key)不存在數據庫中,請重新加載連接,如圖:
通過黑窗口查看redis中的鍵,發現存儲在redis中的key不是設置的string值,前面還多出了許多類似\xac\xed\x00\x05t\x00
操作redis的代碼如下:
@Service public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic List<User> findAll() {// 首先判斷緩存中是否有數據 List<User> users = (List<User>) redisTemplate.boundValueOps("jae:springboot:user:id:1").get();if (users==null) {System.out.println("load from db");// 從數據庫中查詢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時默認使用JdkSerializationRedisSerializer來進行序列化,如下
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; }一般到這里問題差不多可以解決了,但是我是存對象的集合,運行的時候報了一個類型轉換異常,list不能轉string,因此我將存入redis的user對象toString,問題得到解決。
優化redis操作:
- 如果你的pojo沒有重寫toString方法,這時候redis中存的值為對象的地址值,如果需要在redis中展示結果(非地址值),pojo重寫toString即可
- 可以給存入redis的數據設置過期時間,即使我們在redis中看不見對應的數據,無法刪除,但是我們還是可以通過redis的過期時間自動清除記錄,下面示例為 設置過期時間是1小時
總結
以上是生活随笔為你收集整理的springboot中使用RedisTemplate操作redis遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: idea 往 Github 上 push
- 下一篇: mysql的存储过程基本使用