redis的java客戶端StringRedisTemplate、RedisTemplate的用法及區別


簡單記錄一下java處理redis的幾種序列化策略,這里使用的環境是springboot 2.0.4

springboot中提供了StringRedisTemplate和RedisTemplate兩種序列化類,它們都只能讀自己存的數據,即數據互不相通。

主要區別如下:

1、采用的序列化策略不同

StringRedisTemplate采用的是String的序列化策略;RedisTemplate默認采用的是jdk的序列化策略

2、存的數據形式不同

StringRedisTemplate存的是字符串;RedisTemplate存的是字節數組,在redis-cli中看好像亂碼

3、使用范圍不同

StringRedisTemplate只能處理字符串類型的數據,如果存取復雜的對象,又不想做額外的處理,最好用RedisTemplate

4、RedisTemplate可以根據需要設置序列化策略

默認的是jdk的JdkSerializationRedisSerializer,常用的還有Jackson2JsonRedisSerializer等,下面說一下它倆的用法:

默認jdk策略的RedisTemplate

... ...
@Autowired
private RedisTemplate redisTemplate;

public void testSetUser() {
    User user=new User(1,"哈哈",20);
    redisTemplate.opsForValue().set("user",user);
}
        
public User testGetUser() {
    User user=(User)redisTemplate.opsForValue().get("user");
    return user;
}

使用redis-cli客戶端查看如下:

 改成Jackson2策略的RedisTemplate

@Configuration
public class RedisConfig {

    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        
        //使用fastjson序列化
        Jackson2JsonRedisSerializer<Object> fastJsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        //value的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        
        //key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
 
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}
public void testSetUser() {
    User user=new User(1,"哈哈",20);
    redisTemplate.opsForValue().set("user",user);
}
    
public User testGetUser() throws JsonProcessingException {
    //獲取的是obj是java.util.LinkedHashMap類型
    Object obj = redisTemplate.opsForValue().get("user");
    ObjectMapper objectMapper = new ObjectMapper();
    //將map轉化為json字符串
    String objStr = objectMapper.writeValueAsString(obj);
    User user = null;
    try {
        //將json字符串轉化為對象
        user = objectMapper.readValue(objStr,User.class);
    } catch (Exception e) {
        e.printStackTrace();
    } 
    return user;
}    

使用redis-cli客戶端查看如下:

 關於Jdk與Jackson2序列化策略的說明: 

1、使用jdk序列化對象必須實現序列化接口;使用Jackson2無需實現序列化接口(內部實現了)

2、jdk序列化到redis中,key顯示類似於亂碼,Jackson2的key顯示設置的值(創建RedisTemplate時設置了key的序列化)

3、jdk的反序列化很好,直接轉化為對象,Jackson2的讀出來是Map,需要將Map轉為json串,再轉化為類對象

4、如果使用Jackson2讀出來直接轉化為類對象,需要創建RedisTemplate時重新設置(后面補充上)

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM