Springboot下RedisTemplate的兩種序列化方式實(shí)例詳解
一、定義一個配置類,自定義RedisTemplate的序列化方式
@Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){ // 創(chuàng)建RedisTemplate對象 RedisTemplate<String, Object> template = new RedisTemplate<>(); // 設(shè)置連接工廠 template.setConnectionFactory(connectionFactory); // 創(chuàng)建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // 設(shè)置Key的序列化 template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); // 設(shè)置Value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); // 返回 return template; } }
測試類進(jìn)行測試
@SpringBootTest class RedisDemoApplicationTests { @Autowired private RedisTemplate<String, Object> redisTemplate; @Test void testString() { // 寫入一條String數(shù)據(jù) redisTemplate.opsForValue().set("name", "虎哥"); // 獲取string數(shù)據(jù) Object name = redisTemplate.opsForValue().get("name"); System.out.println("name = " + name); } @Test void testObject() { User user = new User(); user.setName("何雨泊"); user.setTel(110); redisTemplate.opsForValue().set("user",user); System.out.println("name = " + user); } }
測試存入字符串
測試存入對象
對象類:
測試結(jié)果如下,能將Java對象自動的序列化為JSON字符串,并且查詢時能自動把JSON反序列化為Java對象。
不過,其中記錄了序列化時對應(yīng)的class名稱,目的是為了查詢時實(shí)現(xiàn)自動反序列化。這會帶來額外的內(nèi)存開銷。
二、繼續(xù)優(yōu)化
這個問題的解決我們可以采用手動序列化的方式,換句話說,就是不借助默認(rèn)的序列化器,而是我們自己來控制序列化的動作,同時,我們只采用String的序列化器,這樣,在存儲value時,我們就不需要在內(nèi)存中就不用多存儲數(shù)據(jù),從而節(jié)約我們的內(nèi)存空間。
這種用法比較普遍,因此SpringDataRedis就提供了RedisTemplate的子類:StringRedisTemplate,它的key和value的序列化方式默認(rèn)就是String方式。省去了我們自定義RedisTemplate的序列化方式的步驟,而是直接使用:
@SpringBootTest public class RedisStringTests { @Autowired private StringRedisTemplate stringRedisTemplate; @Test void testString() { // 寫入一條String數(shù)據(jù) stringRedisTemplate.opsForValue().set("stringRedisTemplate:name", "虎哥"); // 獲取string數(shù)據(jù) Object name = stringRedisTemplate.opsForValue().get("name"); System.out.println("name = " + name); } /* *手動進(jìn)行序列化,比較麻煩 */ @Test void testObject() throws JsonProcessingException{ // 創(chuàng)建 ObjectMapper mapper = new ObjectMapper(); User user = new User(); user.setName("何雨泊"); user.setTel(110); // 手動序列化 String json = mapper.writeValueAsString(user); stringRedisTemplate.opsForValue().set("stringRedisTemplate:user",json); String string = stringRedisTemplate.opsForValue().get("stringRedisTemplate:user"); // 手動反序列化 User user1 = mapper.readValue(string, User.class); System.out.println("name = " + user1); } /* * 利用hutool庫內(nèi)的JSONUtil工具類,省去手動序列化,庫的依賴在下面 * */ @Test void testObject1() { User user = new User(); user.setName("何雨泊"); user.setTel(110); /*利用hutool庫內(nèi)的JSONUtil進(jìn)行自動序列化,將user轉(zhuǎn)json*/ stringRedisTemplate.opsForValue().set("user", JSONUtil.toJsonStr(user)); String userjson = stringRedisTemplate.opsForValue().get("user"); /*將json轉(zhuǎn)為bean對象*/ User user1 = JSONUtil.toBean(userjson, User.class); System.out.println("name = " + user1); } }
hutool庫的依賴
<!--hutool--> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.17</version> </dependency>
測試結(jié)果:
三、總結(jié)
RedisTemplate的兩種序列化實(shí)踐方案:
- 方案一(存在一定問題):
- 自定義RedisTemplate
- 修改RedisTemplate的序列化器為GenericJackson2JsonRedisSerializer
- 方案二(對方案一進(jìn)行優(yōu)化):
- 使用StringRedisTemplate
- 寫入Redis時,手動把對象序列化為JSON 或者 使用工具類JSONUtil進(jìn)行序列化(推薦)
- 讀取Redis時,手動把讀取到的JSON反序列化為對象
到此這篇關(guān)于Springboot下RedisTemplate的兩種序列化方式的文章就介紹到這了,更多相關(guān)Springboot RedisTemplate序列化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- RedisTemplate默認(rèn)序列化方式顯示中文亂碼的解決
- RedisTemplate序列化設(shè)置的流程和具體步驟
- redis redistemplate序列化對象配置方式
- 配置redis的序列化,注入RedisTemplate方式
- Spring?boot?RedisTemplate?序列化服務(wù)化配置方式
- Springboot?引入?Redis?并配置序列化并封裝RedisTemplate?
- Redis之RedisTemplate配置方式(序列和反序列化)
- 解決RedisTemplate的key默認(rèn)序列化器的問題
- Spring的RedisTemplate的json反序列泛型丟失問題解決
相關(guān)文章
IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能一覽
這篇文章主要介紹了IntelliJ IDEA 2020.1 EAP4 發(fā)布,重命名/更改簽名新功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04java 數(shù)值類型分秒時間格式化的實(shí)例代碼
這篇文章主要介紹了java 數(shù)值類型分秒時間格式化的實(shí)例代碼的相關(guān)資料,將秒或分鐘的值轉(zhuǎn)換為xx天xx小時xx分鐘xx秒 如果 “xx” 為0 自動缺省,需要的朋友可以參考下2017-07-07Java源碼分析:Guava之不可變集合ImmutableMap的源碼分析
今天給大家?guī)淼氖顷P(guān)于Java源碼的相關(guān)知識,文章圍繞著Java ImmutableMap展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下,希望能給你帶來幫助2021-06-06Mybatis不啟動項(xiàng)目直接測試Mapper的實(shí)現(xiàn)方法
在項(xiàng)目開發(fā)中,測試單個Mybatis Mapper方法通常需要啟動整個SpringBoot項(xiàng)目,消耗大量時間,本文介紹通過Main方法和Mybatis配置類,快速測試Mapper功能,無需啟動整個項(xiàng)目,這方法使用AnnotationConfigApplicationContext容器2024-09-09