簡單記錄一下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時重新設置(后面補充上)