Redis中序列化的兩種實(shí)現(xiàn)
序列化方式概述
對比同份數(shù)據(jù)初次序列化時(shí)的情況(很多帖子都沒有考慮序列化的同份數(shù)據(jù)是否為二次加載的情況,就給出了結(jié)論)
- StringRedisSerializer: 簡單的字符串序列化,可視化性好(內(nèi)部就是通過String類的new String(bytes) & string.getBytes()實(shí)現(xiàn)的序列化)
- JdkSerializationRedisSerializer: Java提供的序列化方式,效率高,占用空間少,可視化性差
- Jackson2JsonRedisSerializer: 序列化為json字符串,效率低于JdkSerializationRedisSerializer,占用空間多,可視化性好,默認(rèn)情況下對泛型支持差
- GenericJackson2JsonRedisSerializer: 序列化為json字符串,效率同Jackson2JsonRedisSerializer,占用空間多,可視化性好,默認(rèn)情況下對泛型支持友好
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 } ] ]
上面分別是兩種序列化方式的結(jié)果,
GenericJackson2JsonRedisSerializer根據(jù)額外插入的類全限定名通過反射可以正確得到實(shí)體類的實(shí)例。
而Jackson2JsonRedisSerializer由于沒有插入額外的信息,那么只能通過不同的數(shù)據(jù)結(jié)構(gòu)來組裝反序列化后的內(nèi)容。例如上面的Json串反序列化的結(jié)果類型為: ArrayList<LinkedHashMap>,使用LinkedHashMap來組裝實(shí)體類對象的字段與字段值。
為什么會這樣?
二者本質(zhì)都是使用的ObjectMapper,只不過GenericJackson2JsonRedisSerializer在內(nèi)部對ObjectMapper進(jìn)行了特定配置而已:
public GenericJackson2JsonRedisSerializer() { this((String) null); } public GenericJackson2JsonRedisSerializer(@Nullable String classPropertyTypeName) { this(new ObjectMapper()); registerNullValueSerializer(mapper, classPropertyTypeName); // 下面的配置就是在序列化結(jié)果中加入實(shí)體類全限定名的配置 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時(shí),可以自己創(chuàng)建一個(gè)ObjectMapper對象,并進(jìn)行上面的配置后,通過構(gòu)造方法進(jìn)行傳遞。那么最后Jackson2JsonRedisSerializer的序列化效果和GenericJackson2JsonRedisSerializer是一樣的。
常用配置
根據(jù)以上內(nèi)容,給出一份RedisTemplate的常用配置:
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { // key 采用StringRedisSerializer // value 采用GenericJackson2JsonRedisSerializer RedisTemplate<String, Object> template = new RedisTemplate<>(); // 關(guān)閉啟用默認(rèn)配置 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; }
到此這篇關(guān)于Redis中序列化的兩種實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Redis 序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis實(shí)現(xiàn)編碼生成規(guī)則方式
在自動生成編碼時(shí)應(yīng)采用“MD+年月日+4位序列號”的規(guī)則,如“MD202310130001”,為避免使用隨機(jī)序列號導(dǎo)致的重復(fù)編碼,建議使用從0開始的自增序列號,此外,使用Redis的incrBy功能實(shí)現(xiàn)序列號自增,可以有效提高效率和降低實(shí)現(xiàn)難度2023-01-01redis中opsForList().range()的使用方法詳解
這篇文章主要給大家介紹了關(guān)于redis中opsForList().range()的使用方法,文中通過實(shí)例代碼以及圖文介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03Redis禁用命令、危險(xiǎn)命令及規(guī)避方法
這篇文章主要介紹了Redis禁用命令、危險(xiǎn)命令及規(guī)避方法,本文介紹了個(gè)非常致命的兩個(gè)命令以及用配置文件禁用這些命令的方法,需要的朋友可以參考下2015-06-06Redis分布式鎖如何實(shí)現(xiàn)續(xù)期
這篇文章主要介紹了Redis分布式鎖如何實(shí)現(xiàn)續(xù)期的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01