RedisTemplate配置序列化器無效
阿新 • • 發佈:2020-12-05
Redis是一種執行在記憶體的資料庫,執行速度很快,1s內可完成10萬次的讀寫,效能十分高效,在現今的網際網路應用中使用很廣泛。常見的場景是做熱點資料的快取、分散式快取、分散式鎖.....,Spring也對Redis進行了整合,設定了RedisTemplate這個強大的類,用來操作redis。
配置RedisTemplate也非常的簡單,直接上程式碼
@Configuration public class RedisConfig { @Autowired private RedisConnectionFactory connectionFactory; @Bean public RedisTemplate<String,Object> initRedisTemplate(){ RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); //配置序列化器 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer()); return redisTemplate; } }
這裡配置了序列化器,Redis是基於字串儲存的NoSQL,而java是基於物件的語言,物件是無法儲存到Redis中的,不過java提供了序列化機制,只要類實現了Java.io.Serializable介面,就代表類的物件能夠進行序列化,通過將類物件進行序列化就能夠得到二進位制字串,這樣Redis就可以將這些類物件以字串進行儲存,像這樣的
RedisTemplate預設使用的是JdkSerializationRedisSerializer系列化器,上圖這字串就是被它序列化的字串,這樣的字串不利於我們追蹤,給查詢Redis資料帶來了很大的困難,為了使Redis的鍵以普通字串儲存,我們需要配置字串序列化器StringSericalizer,這裡我將Redis的鍵和雜湊結構的field和value採用了字串序列化器。接下來我們就直接使用了。
@RestController public class UserController { @Autowired private RedisTemplate redisTemplate; @RequestMapping(value = "/getUser") public String getUser(){ redisTemplate.opsForValue().set("huahua","cenyu"); String value = (String) redisTemplate.opsForValue().get("huahua"); System.out.println(redisTemplate.getKeySerializer()); return value; } }
請求訪問後,我們查了redis庫,我們發現key依然儲存的是一個複雜的字串,而列印的序列化器也依然是預設的序列化,這是怎麼回事呢?
於是我把我配置的RedisTemplate以及控制層自動注入的RedisTemplate物件打印出來,發現兩個都不是同一個物件
這就難怪了物件都不是同一個,也難怪會配置了沒反應。
解決方案1:
解決方案2: