springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较
文章目录
- 一、redisTemplate和stringRedisTemplate对比
- 1、StringRedisTemplate
- 2、RedisTemplate
- 二、redisTemplate序列化方式比较
- 1、性能测试对比
- 2、性能总结
- 3、方案一、考虑效率和可读性,牺牲部分空间
- 4、方案二、空间敏感,忽略可读性和效率影响
- 5、使用示例
- SpringBoot中RedisTemplate更改序列化方式
一、redisTemplate和stringRedisTemplate对比
RedisTemplate看这个类的名字后缀是Template,如果了解过Spring如何连接关系型数据库的,大概不会难猜出这个类是做什么的 ,它跟JdbcTemplate一样封装了对Redis的一些常用的操作,当然StringRedisTemplate跟RedisTemplate功能类似那么肯定就会有人问,为什么会需要两个Template呢,一个不就够了吗?其实他们两者之间的区别主要在于他们使用的序列化类。
RedisTemplate使用的是 JdkSerializationRedisSerializer 序列化对象
StringRedisTemplate使用的是 StringRedisSerializer 序列化String
1、StringRedisTemplate
- 主要用来存储字符串,StringRedisSerializer的泛型指定的是String。当存入对象时,会报错 :can not cast into String。
- 可见性强,更易维护。如果过都是字符串存储可考虑用StringRedisTemplate。
2、RedisTemplate
- 可以用来存储对象,但是要实现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)
springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较相关推荐
- SpringBoot中对于异常处理的提供的五种处理方式
SpringBoot中对于异常处理的提供的五种处理方式 参考文章: (1)SpringBoot中对于异常处理的提供的五种处理方式 (2)https://www.cnblogs.com/weirdo-l ...
- Kryo,Hessain,Protostuff三种序列化方式对比
前言 前段时间在写RPC框架的时候用到了Kryo.Hessian.Protostuff三种序列化方式.但是当时因为急于实现功能,就只是简单的的看了一下如何使用这三种序列化方式,并没有去深入研究各自的特 ...
- SpringBoot整合Redis 之 StringRedisTemplate、RedisTemplate 基础
SpringBoot 整合 Redis 环境准备 引入依赖 配置文件 StringRedisTemplate 基本使用 Key 常用操作 String 常用操作 List 常用操作 Set 常用操作 ...
- Springboot下RedisTemplate的两种序列化方式
一.定义一个配置类,自定义RedisTemplate的序列化方式 @Configuration public class RedisConfig {@Beanpublic RedisTemplate& ...
- Redis - RedisTemplate及4种序列化方式深入解读
文章目录 概述 RedisTemplate StringRedisTemplate RedisSerializer 序列化 接口 JDK 序列化方式 (默认) String 序列化方式 JSON 序列 ...
- 深入理解 Redis Template及4种序列化方式__spring boot整合redis实现RedisTemplate三分钟快速入门
概述 使用Spring 提供的 Spring Data Redis 操作redis 必然要使用Spring提供的模板类 RedisTemplate, 今天我们好好的看看这个模板类 . RedisTem ...
- Spring/SpringBoot系列之Spring中涉及的9种设计模式【七】
1. 总览 Spring中涉及的设计模式: 简单工厂(非23种设计模式中的一种) 工厂方法 单例模式 适配器模式 装饰器模式 代理模式 观察者模式 策略模式 模版方法模式 2. 详细介绍 2.1 简单 ...
- springboot 没有找到service_Spring Boot 应用程序五种部署方式
翻译自 Deploying Spring Boot Applications[1] 原作者 Murat Artim[2] 可以使用各种方法将 Spring Boot 应用程序部署到生产系统中.在本文中 ...
- Redis序列化、RedisTemplate序列化方式大解读,介绍Genericjackson2jsonredisserializer序列化器的坑
前言 上一篇已经介绍了优雅的操作Redis: [小家Spring]Spring Boot中使用RedisTemplate优雅的操作Redis,并且解决RedisTemplate泛型注入的问题.本篇着重 ...
最新文章
- 【C语言应用实例】输出当月日历
- Java - Java集合中的快速失败Fail Fast 机制
- usaco1.2.2 transform
- java hashmap 添加_JAVA—HashMap
- 工作136:eachrt
- 开篇词:如何轻松获得 Offer
- PL/SQL第三课(学习笔记)
- 【IDEA工具设置】IDEA引入新项目以及项目配置
- linux 查看系统信息命令
- 解决ubuntu下不能mount windows 盘的问题
- C/C++调用python,opencv+python
- java导入hbase_如何用java导入hbase.dat文件
- 手把手教会你mp3音频转文字怎么操作,快来码住
- STM32使用HAL库驱动W5500
- 上下文切换调优-性能设计沉思录(9)
- css不同大小字体底部对齐
- Android 复制 粘贴 剪贴板的使用 ClipboardManager
- 流媒体服务器原理和架构解析
- BootStrap富文本编辑器Summernote
- echart 边框线_echarts 饼图给外层加边框
热门文章
- scala 拆分字符串翻转_Scala程序分割字符串
- python创建空元组_用Python创建空元组
- pipedreader_Java PipedReader connect()方法与示例
- vb mysql 表格显示,在VB中编辑数据库和电子表格
- c语言怎么写星星代码,C语言打印星星的问题
- codejam题目_嵌套深度-Google CodeJam 2020资格回合问题解决方案
- C# ArrayList 与 string、string[] 的转换
- python lxml xpath爬取图片代码
- mysql怎么修改表中的文字_mysql表中怎么修改字段?
- 频段表_5G频段范围之:频段3.3GHz-4.2GHz (n77,n78)