1. 程式人生 > 資料庫 >RedisTemplate配置序列化器無效

RedisTemplate配置序列化器無效

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: