Redis序列化設(shè)置以及jetcache連接Redis序列化的設(shè)置過程
1、問題
問題:
我在使用jetchche進(jìn)行連接redis的時(shí)候,存入redis的value一直使用的是redis默認(rèn)的序列化方式,是使用的jdk序列化。
當(dāng)我使用jetcache向redis存入一個(gè)對(duì)象
存入redis的結(jié)果:
這是使用jdk序列化的結(jié)果。
但是我記得使用redis的時(shí)候可以更改序列化方式為json序列化,如果使用json序列化的結(jié)果就是這樣的:
我想把jetcache的序列化方式也改成這種可讀性好的。
2、Redis序列化的設(shè)置
當(dāng)我們使用springDataRedis依賴直接連接redis的時(shí)候我們默認(rèn)使用的也是jdk序列化,此時(shí)我們存入這個(gè)user對(duì)象的結(jié)果就和這個(gè)是一樣的。
這種序列化的方式可讀性比較差。
更改序列化的方式:
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){ // 創(chuàng)建RedisTemplate對(duì)象 RedisTemplate<String, Object> template = new RedisTemplate<>(); // 設(shè)置連接工廠 template.setConnectionFactory(connectionFactory); // 創(chuàng)建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 設(shè)置Key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // 設(shè)置Value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); // 返回 return template; } }
此時(shí)我們就可以進(jìn)行接送序列化存入redis的就是這樣的:
這樣存入redis的時(shí)候因?yàn)榍懊鏁?huì)加上一串這個(gè)對(duì)象的信息,這樣也額外占用了空間。
如果我們需要解決占用的這部分空間,我們可以手動(dòng)進(jìn)行JSON序列化,然后同一使用String序列化器。
@Autowired private StringRedisTemplate stringRedisTemplate; // JSON序列化工具 private static final ObjectMapper mapper = new ObjectMapper(); @Test void testSaveUser() throws JsonProcessingException { // 創(chuàng)建對(duì)象 User user = new User("虎哥", 21); // 手動(dòng)序列化 String json = mapper.writeValueAsString(user); // 寫入數(shù)據(jù) stringRedisTemplate.opsForValue().set("user:200", json); // 獲取數(shù)據(jù) String jsonUser = stringRedisTemplate.opsForValue().get("user:200"); // 手動(dòng)反序列化 User user1 = mapper.readValue(jsonUser, User.class); System.out.println("user1 = " + user1); }
此時(shí),存入的json字符串就沒有了前面類的信息。
3、jetcache序列化設(shè)置
我們使用jetcache使用redis作為遠(yuǎn)程緩存時(shí),默認(rèn)序列化工具也是使用的JDK序列化,jetcahce提供的配置文件中有這么一項(xiàng):keyConvertor,這個(gè)配置可以指定為alibaba的fastjson的序列化工具,但是這個(gè)修改的時(shí)key的序列化,而不是value。
我們還是達(dá)不到提高可讀性的效果。
這是官方提供的jetcache的配置:
jetcache: statIntervalMinutes: 15 areaInCacheName: false local: default: type: linkedhashmap #other choose:caffeine keyConvertor: fastjson2 #other choose:fastjson/jackson limit: 100 remote: default: type: redis keyConvertor: fastjson2 #other choose:fastjson/jackson broadcastChannel: projectA valueEncoder: java #other choose:kryo/kryo5 valueDecoder: java #other choose:kryo/kryo5 poolConfig: minIdle: 5 maxIdle: 20 maxTotal: 50 host: ${redis.host} port: ${redis.port}
我們可以看到有個(gè)配置叫做 valueEncoder和valueDecoder。這個(gè)配置才是真正的value的序列化工具。
這個(gè)配置jetcache給我們提供了三個(gè)選擇,分別是:java(jdk序列化),kryo和kryo5。
并不能改成json序列化。
總結(jié)
單獨(dú)使用redis的時(shí)候可以改序列化工具為json序列化,但是更推薦使用手動(dòng)序列化然后直接存String,這樣更省空間。
如果使用jetcache的時(shí)候只能改為jdk,kryo序列化工具,暫時(shí)不支持使用json序列化工具。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
基于Redis有序集合實(shí)現(xiàn)滑動(dòng)窗口限流的步驟
滑動(dòng)窗口算法是一種基于時(shí)間窗口的限流算法,通過動(dòng)態(tài)地滑動(dòng)窗口,可以動(dòng)態(tài)調(diào)整限流的速率,Redis有序集合可以用來實(shí)現(xiàn)滑動(dòng)窗口限流,本文介紹基于Redis有序集合實(shí)現(xiàn)滑動(dòng)窗口限流,感興趣的朋友一起看看吧2024-12-12詳解基于redis實(shí)現(xiàn)的四種常見的限流策略
限流算法在分布式領(lǐng)域是一個(gè)經(jīng)常被提起的話題,當(dāng)系統(tǒng)的處理能力有限時(shí), 如何阻止計(jì)劃外的請(qǐng)求繼續(xù)對(duì)系統(tǒng)施壓,這是一個(gè)需要重視的問題。除了控制流量,限流還有一個(gè)應(yīng)用目的是控制用戶行為,避免垃圾請(qǐng)求2021-06-06Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解
這篇文章主要介紹了Redis?哈希Hash底層數(shù)據(jù)結(jié)構(gòu)詳解的相關(guān)資料,需要的朋友可以參考下2022-08-08多維度深入分析Redis的5種基本數(shù)據(jù)結(jié)構(gòu)
此篇文章主要對(duì)Redis的5種基本數(shù)據(jù)類型,即字符串(String)、列表(List)、散列(Hash)、集合(Set)、有序集合(Sorted?Set),從使用場(chǎng)景和底層結(jié)構(gòu)出發(fā),進(jìn)行多維度深入分析。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解
Redis是一個(gè)開源的、基于BSD許可證的,基于內(nèi)存的、鍵值存儲(chǔ)NoSQL數(shù)據(jù)本篇文章主要介紹了在CentOS 7環(huán)境下安裝Redis數(shù)據(jù)庫詳解,有興趣的可以了解一下。2016-11-11基于redis實(shí)現(xiàn)定時(shí)任務(wù)的方法詳解
這篇文章主要給大家介紹了基于redis實(shí)現(xiàn)定時(shí)任務(wù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08