日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较

發(fā)布時間:2025/3/12 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、redisTemplate和stringRedisTemplate對比
      • 1、StringRedisTemplate
      • 2、RedisTemplate
  • 二、redisTemplate序列化方式比較
      • 1、性能測試對比
      • 2、性能總結
      • 3、方案一、考慮效率和可讀性,犧牲部分空間
      • 4、方案二、空間敏感,忽略可讀性和效率影響
      • 5、使用示例
  • SpringBoot中RedisTemplate更改序列化方式

一、redisTemplate和stringRedisTemplate對比

RedisTemplate看這個類的名字后綴是Template,如果了解過Spring如何連接關系型數據庫的,大概不會難猜出這個類是做什么的 ,它跟JdbcTemplate一樣封裝了對Redis的一些常用的操作,當然StringRedisTemplate跟RedisTemplate功能類似那么肯定就會有人問,為什么會需要兩個Template呢,一個不就夠了嗎?其實他們兩者之間的區(qū)別主要在于他們使用的序列化類。

RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化對象 StringRedisTemplate使用的是 StringRedisSerializer 序列化String

1、StringRedisTemplate

  • 主要用來存儲字符串,StringRedisSerializer的泛型指定的是String。當存入對象時,會報錯 :can not cast into String。
  • 可見性強,更易維護。如果過都是字符串存儲可考慮用StringRedisTemplate。

2、RedisTemplate

  • 可以用來存儲對象,但是要實現(xiàn)Serializable接口。
  • 以二進制數組方式存儲,內容沒有可讀性。

二、redisTemplate序列化方式比較

那有沒有辦法,可以序列化對象,可讀性又強呢?

  • 1、手動轉化成json串再存儲。取出數據需要反序列化。
  • 2、使用其他序列化方式。

spring-data-redis提供如下幾種選擇:

  • GenericToStringSerializer: 可以將任何對象泛化為字符串并序列化
  • Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer實際上是一樣的
  • JacksonJsonRedisSerializer: 序列化object對象為json字符串
  • JdkSerializationRedisSerializer: 序列化java對象
  • StringRedisSerializer: 簡單的字符串序列化

1、性能測試對比

@Testpublic void testSerial(){UserPO userPO = new UserPO(1111L,"小明_testRedis1",25);List<Object> list = new ArrayList<>();for(int i=0;i<200;i++){list.add(userPO);}JdkSerializationRedisSerializer j = new JdkSerializationRedisSerializer();GenericJackson2JsonRedisSerializer g = new GenericJackson2JsonRedisSerializer();Jackson2JsonRedisSerializer j2 = new Jackson2JsonRedisSerializer(List.class);Long j_s_start = System.currentTimeMillis();byte[] bytesJ = j.serialize(list);System.out.println("JdkSerializationRedisSerializer序列化時間:"+(System.currentTimeMillis()-j_s_start) + "ms,序列化后的長度:" + bytesJ.length);Long j_d_start = System.currentTimeMillis();j.deserialize(bytesJ);System.out.println("JdkSerializationRedisSerializer反序列化時間:"+(System.currentTimeMillis()-j_d_start));Long g_s_start = System.currentTimeMillis();byte[] bytesG = g.serialize(list);System.out.println("GenericJackson2JsonRedisSerializer序列化時間:"+(System.currentTimeMillis()-g_s_start) + "ms,序列化后的長度:" + bytesG.length);Long g_d_start = System.currentTimeMillis();g.deserialize(bytesG);System.out.println("GenericJackson2JsonRedisSerializer反序列化時間:"+(System.currentTimeMillis()-g_d_start));Long j2_s_start = System.currentTimeMillis();byte[] bytesJ2 = j2.serialize(list);System.out.println("Jackson2JsonRedisSerializer序列化時間:"+(System.currentTimeMillis()-j2_s_start) + "ms,序列化后的長度:" + bytesJ2.length);Long j2_d_start = System.currentTimeMillis();j2.deserialize(bytesJ2);System.out.println("Jackson2JsonRedisSerializer反序列化時間:"+(System.currentTimeMillis()-j2_d_start));}

結果:

JdkSerializationRedisSerializer序列化時間:8ms,序列化后的長度:1325 JdkSerializationRedisSerializer反序列化時間:4 GenericJackson2JsonRedisSerializer序列化時間:52ms,序列化后的長度:17425 GenericJackson2JsonRedisSerializer反序列化時間:60 Jackson2JsonRedisSerializer序列化時間:4ms,序列化后的長度:9801 Jackson2JsonRedisSerializer反序列化時間:4

2、性能總結

  • JdkSerializationRedisSerializer序列化后長度最小,Jackson2JsonRedisSerializer效率最高。
  • 如果綜合考慮效率和可讀性,犧牲部分空間,推薦key使用StringRedisSerializer,保持的key簡明易讀;value可以使用Jackson2JsonRedisSerializer
  • 如果空間比較敏感,效率要求不高,推薦key使用StringRedisSerializer,保持的key簡明易讀;value可以使用JdkSerializationRedisSerializer

3、方案一、考慮效率和可讀性,犧牲部分空間

package com.example.demo.config.redisConfig;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration public class RedisConfig {@Bean(name = "redisTemplate")public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化類型Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value的序列化類型return redisTemplate;} }

注: new Jackson2JsonRedisSerializer(Object.class)需要指明類型,例如:new Jackson2JsonRedisSerializer(User.class),否則會報錯:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.demo.bean.User。

或者開啟默認類型:

ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

這種方式存儲時會自動帶上類的全路徑,占用部分空間:

4、方案二、空間敏感,忽略可讀性和效率影響

@Configuration public class RedisConfig {@Bean(name = "redisTemplate")public RedisTemplate<String, Object> getRedisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();redisTemplate.setConnectionFactory(factory);redisTemplate.setKeySerializer(new StringRedisSerializer()); // key的序列化類型redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); // value的序列化類型return redisTemplate;} }

[](javascript:void(0)😉

注:該方式,對象需要實現(xiàn)接口:Serializable

5、使用示例

@RunWith(SpringRunner.class) @SpringBootTest @WebAppConfiguration public class RedisTest {@Resourceprivate RedisTemplate redisTemplate;@Testpublic void testRedis1(){User user = new User();user.setAge(11);user.setName("我是小王1");redisTemplate.opsForValue().set("user37",user);System.out.println(redisTemplate.getValueSerializer());System.out.println(redisTemplate.getKeySerializer());User result = (User) redisTemplate.opsForValue().get("user37");System.out.println(result);} }

SpringBoot中RedisTemplate更改序列化方式

可以通過手動配置, 將RedisTemplate的序列化方式進行更改

package com.wenbronk.data.redis;import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer;@SpringBootApplication public class RedisApplication {public static void main(String[] args) {SpringApplication.run(RedisApplication.class, args);}/*** redisTemplate 序列化使用的jdkSerializeable, 存儲二進制字節(jié)碼, 所以自定義序列化類* @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 使用Jackson2JsonRedisSerialize 替換默認序列化Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);// 設置value的序列化規(guī)則和 key的序列化規(guī)則redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;} }

總結

以上是生活随笔為你收集整理的springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。