Redis中序列化的兩種實現(xiàn)
序列化方式概述
對比同份數(shù)據(jù)初次序列化時的情況(很多帖子都沒有考慮序列化的同份數(shù)據(jù)是否為二次加載的情況,就給出了結論)
- StringRedisSerializer: 簡單的字符串序列化,可視化性好(內(nèi)部就是通過String類的new String(bytes) & string.getBytes()實現(xiàn)的序列化)
- JdkSerializationRedisSerializer: Java提供的序列化方式,效率高,占用空間少,可視化性差
- Jackson2JsonRedisSerializer: 序列化為json字符串,效率低于JdkSerializationRedisSerializer,占用空間多,可視化性好,默認情況下對泛型支持差
- GenericJackson2JsonRedisSerializer: 序列化為json字符串,效率同Jackson2JsonRedisSerializer,占用空間多,可視化性好,默認情況下對泛型支持友好
Jackson2JsonRedisSerializer 對比 GenericJackson2JsonRedisSerializer
Jackson2JsonRedisSerializer [ { "id": "1", "parentId": "2", "content": "Node1", "children": null }, { "id": null, "parentId": null, "content": null, "children": null } ]
GenericJackson2JsonRedisSerializer [ "java.util.ArrayList", [ { "@class": "life.cqq.blog.common.entity.Toc", "id": "1", "parentId": "2", "content": "Node1", "children": null }, { "@class": "life.cqq.blog.common.entity.Toc", "id": null, "parentId": null, "content": null, "children": null } ] ]
上面分別是兩種序列化方式的結果,
GenericJackson2JsonRedisSerializer根據(jù)額外插入的類全限定名通過反射可以正確得到實體類的實例。
而Jackson2JsonRedisSerializer由于沒有插入額外的信息,那么只能通過不同的數(shù)據(jù)結構來組裝反序列化后的內(nèi)容。例如上面的Json串反序列化的結果類型為: ArrayList<LinkedHashMap>,使用LinkedHashMap來組裝實體類對象的字段與字段值。
為什么會這樣?
二者本質(zhì)都是使用的ObjectMapper,只不過GenericJackson2JsonRedisSerializer在內(nèi)部對ObjectMapper進行了特定配置而已:
public GenericJackson2JsonRedisSerializer() { this((String) null); } public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) { this(new ObjectMapper()); registerNullValueSerializer(mapper, classPropertyTypeName); // 下面的配置就是在序列化結果中加入實體類全限定名的配置 if (StringUtils.hasText(classPropertyTypeName)) { mapper.enableDefaultTypingAsProperty(DefaultTyping.NON_FINAL, classPropertyTypeName); } else { mapper.enableDefaultTyping(DefaultTyping.NON_FINAL, As.PROPERTY); } } public GenericJackson2JsonRedisSerializer(ObjectMapper mapper) { Assert.notNull(mapper, "ObjectMapper must not be null!"); this.mapper = mapper; }
使用Jackson2JsonRedisSerializer時,可以自己創(chuàng)建一個ObjectMapper對象,并進行上面的配置后,通過構造方法進行傳遞。那么最后Jackson2JsonRedisSerializer的序列化效果和GenericJackson2JsonRedisSerializer是一樣的。
常用配置
根據(jù)以上內(nèi)容,給出一份RedisTemplate的常用配置:
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { // key 采用StringRedisSerializer // value 采用GenericJackson2JsonRedisSerializer RedisTemplate<String, Object> template = new RedisTemplate<>(); // 關閉啟用默認配置 template.setEnableDefaultSerializer(false); // 連接工廠 template.setConnectionFactory(factory); // key 序列化方式 template.setKeySerializer(RedisSerializer.string()); // value 序列化方式 template.setValueSerializer(RedisSerializer.json()); // hash key 序列化方式 template.setHashKeySerializer(RedisSerializer.string()); // hash value 序列化方式 template.setHashValueSerializer(RedisSerializer.json()); // 配置完成 template.afterPropertiesSet(); return template; }
到此這篇關于Redis中序列化的兩種實現(xiàn)的文章就介紹到這了,更多相關Redis 序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
redis中opsForList().range()的使用方法詳解
這篇文章主要給大家介紹了關于redis中opsForList().range()的使用方法,文中通過實例代碼以及圖文介紹的非常詳細,對大家學習或者使用redis具有一定的參考學習價值,需要的朋友可以參考下2023-03-03