Redis中序列化的兩種實現(xiàn)
序列化方式概述
對比同份數(shù)據(jù)初次序列化時的情況(很多帖子都沒有考慮序列化的同份數(shù)據(jù)是否為二次加載的情況,就給出了結(jié)論)
- StringRedisSerializer: 簡單的字符串序列化,可視化性好(內(nèi)部就是通過String類的new String(bytes) & string.getBytes()實現(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ù)額外插入的類全限定名通過反射可以正確得到實體類的實例。
而Jackson2JsonRedisSerializer由于沒有插入額外的信息,那么只能通過不同的數(shù)據(jù)結(jié)構(gòu)來組裝反序列化后的內(nèi)容。例如上面的Json串反序列化的結(jié)果類型為: ArrayList<LinkedHashMap>,使用LinkedHashMap來組裝實體類對象的字段與字段值。
為什么會這樣?
二者本質(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é)果中加入實體類全限定名的配置
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對象,并進(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中序列化的兩種實現(xiàn)的文章就介紹到這了,更多相關(guān)Redis 序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Redis高效恢復(fù)策略內(nèi)存快照與AOF
這篇文章主要為大家介紹了Redis高效恢復(fù)策略內(nèi)存快照與AOF及對比詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
Redis過期Key刪除策略和內(nèi)存淘汰策略的實現(xiàn)
當(dāng)內(nèi)存使用達(dá)到上限,就無法存儲更多數(shù)據(jù)了,為了解決這個問題,Redis內(nèi)部會有兩套內(nèi)存回收的策略,過期Key刪除策略和內(nèi)存淘汰策略,本文就來詳細(xì)的介紹一下這兩種方法,感興趣的可以了解一下2024-02-02
Redis全文搜索教程之創(chuàng)建索引并關(guān)聯(lián)源數(shù)據(jù)的教程
RediSearch提供了一種簡單快速的方法對 hash 或者 json 類型數(shù)據(jù)的任何字段建立二級索引,然后就可以對被索引的 hash 或者 json 類型數(shù)據(jù)字段進(jìn)行搜索和聚合操作,這篇文章主要介紹了Redis全文搜索教程之創(chuàng)建索引并關(guān)聯(lián)源數(shù)據(jù),需要的朋友可以參考下2023-12-12
Redis源碼解析:集群手動故障轉(zhuǎn)移、從節(jié)點遷移詳解
這篇文章主要介紹了Redis源碼解析:集群手動故障轉(zhuǎn)移、從節(jié)點遷移的相關(guān)內(nèi)容,涉及通過集群定時器函數(shù)clusterCron實現(xiàn)從節(jié)點遷移等知識,具有一定參考價值,需要的朋友可以了解。2017-10-10

