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。

img

2、RedisTemplate

  • 可以用来存储对象,但是要实现Serializable接口。
  • 以二进制数组方式存储,内容没有可读性。

img

二、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);

这种方式存储时会自动带上类的全路径,占用部分空间:

img

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)😉

注:该方式,对象需要实现接口: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, 存储二进制字节码, 所以自定义序列化类* @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的序列化规则和 key的序列化规则redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.afterPropertiesSet();return redisTemplate;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql查询默认排序规则_深究 mysql 默认排序, order by 的顺序【收藏】

mysql 语句中如果没有使用 order by 来排序&#xff0c;通常会用 主键正序排列&#xff0c;但是有的时候不是这样&#xff0c;来看一个实例。实例群友问&#xff1a;请教一个问题&#xff0c;mysql 默认排序问题&#xff0c;当sql 语句 的排序没有指定 主键&#xff08;id&…

Spring Boot jackson配置使用详解

Spring Boot系列-json框架jackson配置详解 T1 - 前言 目前Java最常见的3中JSON操作框架分别为Gson、Jackson、FastJson&#xff0c;该篇文章主要讲解jackson在SpringBoot环境中各配置项的具体作用。 T2 - 环境依赖 jackson是spring-boot的web/webflux框架默认依赖的json库&…

频率统计表用c语言_空间矢量脉宽调制建模与仿真(基于C语言的SIMULINK仿真模型 | 基于SVPWM模块的仿真)...

文末有仿真模型下载方式1.1 基于C语言的SIMULINK仿真模型使用C语言在MATLAB/SIMULINK中仿真&#xff0c;需要借助s-function builder模块实现。七段式SVPWM仿真模型如图1-1所示。仿真解算器&#xff08;Solver&#xff09;选择变步长&#xff08;Variable-step&#xff09;、od…

php基本语法 格式,PHP 基本语法格式

PHP 基本语法格式标准代码如下:复制代码 代码如下:...?>短标签模式(此模式需要修改PHP配置&#xff0c;让PHP支持短标签模式)&#xff1a;复制代码 代码如下:...?>注释&#xff1a;复制代码 代码如下:/* ...*///#时间&#xff1a; 2009-12-14Abs: 取得绝对值. Acos: 取…

linux 服务器启用端口,linux服务器放行端口

一、默认使用iptables的系统(例如centos6)1、关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放。下面是命令实现&#xff1a;iptables -P INPUT DROPiptables -P FORWARD DROPiptables -P OUTPUT DROP再用命令iptables -L -n查看 是否设置好&#xff0c; 好看到全部 DROP 了这…

MySQL 无符号和有符号的区别

随笔记录: mysql无符号和有符号的区别 无符号unsigned 表示设置的的数据为0或者正数&#xff1b; 有符号则可以是负数 -&#xff1b; 内存占比 有符号 0-255 无符号 -127~127

linux下tomcat启动后无进程,Linux中Tomcat shutdown.sh后进程仍然存在解决办法

最近我们在使用Jenkins自动化部署项目时&#xff0c;在生产liunx环境下&#xff0c;使用脚本shutdown.sh停止tomcat服务&#xff0c;然后再start之后发现应用无法访问了&#xff0c;后台查看tomcat进程是发现有个2个tomcat进程&#xff0c;说明之前的shutdown并没有完全停掉tom…

扫地机器人电路原理图_扫地机有这一台就够了:石头扫地机器人T6 首拆

听说集齐13台扫地机器人可以召唤扫地机神兽&#xff0c;所以集齐了22台扫地机后我的神兽呢&#xff1f;自从上个月入手了石头科技出品的小瓦青春版扫地机之后已经集齐了所有小米(石头)系扫地机。小瓦青春版是一款无序清洁的扫地机产品&#xff0c;也是石头科技价格最低的入门级…

让我放弃FastDFS拥抱MinIO的8个瞬间

目前可用于文件存储的网络服务选择有很多&#xff0c;比如阿里云OSS、七牛云、腾讯云等等&#xff0c;但是收费都有点小贵。为了帮公司节约成本&#xff0c;之前一直是使用fastDFS作为文件服务器&#xff0c;准确的说是图片服务器。直到我发现了MinIO&#xff0c;我决定放弃Fas…

http 和 https_Golang设置https访问,以及http如何重定向到https

设置https访问&#xff1a;初始代码为http监听&#xff1a;func main() { server : &http.Server{ Addr: ":8080", ... } go func() { if err : server.ListenAndServe(); err ! nil && err ! http.ErrServerClosed { log.Fa…

盘点分布式文件存储系统____分布式文件存储系统简介

盘点分布式文件存储系统 在项目的数据存储中&#xff0c;结构化数据通常采用关系型数据库&#xff0c;非结构化数据&#xff08;文件&#xff09;的存储就有很多种方式&#xff0c;服务器本地存储、Nas挂载、ftp等等&#xff0c;今天就来盘点一下&#xff0c;分布式文件存储系统…

常见分布式文件存储介绍、选型比较、架构设计

数据正成为世界上最有价值的资源&#xff0c;分布式文件存储是应对数据爆炸的最好解决方案&#xff0c;那就会涉及到分布式文件存储方案、选型、架构设计等。 分布式文件存储的来源 在这个数据爆炸的时代&#xff0c;产生的数据量不断地在攀升&#xff0c;从GB,TB,PB,ZB.挖掘…

为什么python工程师掌握这些就够了_Python工程师薪资飙升,Python这些技能你掌握了吗...

Python的火热&#xff0c;也带动了工程师们的就业热。那么&#xff0c;Python的市场需求和工程师待遇到底如何呢&#xff1f;今天我们来看看具体数据。2019年招聘python工程师薪资飙升&#xff0c;Python这些技能你掌握了吗?Python岗位和待遇和要求怎么样&#xff1f;下面从招…

canvas js 绘图插件_Canvas专题—绘制柱状图(2)

目标&#xff1a;在我们了解过前两章节的知识点以后&#xff0c;为了把知识点进行连结&#xff0c;拓展&#xff0c;现在我们做一个图表吧。看一个echartst图表当今Canvas库有很多供我们选择&#xff0c;比如&#xff0c;echarts在很大程度上能够提高我们的工作效率&#xff0c…

界面优美的linux,Ubuntu 11.04新版发布 诠释精美用户界面

主要改进内容如下&#xff1a;Unity界面在Alpha 3中进行了重大改进&#xff0c;重新设计了Dash面板的功能&#xff0c;可以按类别显示应用程序&#xff0c;此外还包括更好的搜索过滤、支持全屏以及其他视觉效果的提升。Ubuntu 11.04 Alpha 3升级了安装程序&#xff0c;用户如今…

springboot 使用 minio

springboot 使用 minio yml 配置 yml 配置 # ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ minio:url: http://114.67.110.190:9001accessKey: minioadminsecretKey: minioadminbucketName: zpfmaven: <dependency><groupId>io.minio</groupId><artifa…

立创EDA

绘制PCB流程&#xff1a; 画原理图 ——> 画原理图 ——> 布线 ——> 铺铜 器件&#xff1a; 器件就是一个个不同的元件&#xff0c;每个元件不同的引脚有不同的功能&#xff0c;但有可能封装是一样的&#xff0c;所以将器件和封装练习起来&#xff0c;才能将…

python中sorted函数的用法_Python3 中sorted() 函数的用法

描述 sorted() 函数对所有可迭代的对象进行排序操作。 语法 sorted(iterable, keyNone, reverseFalse) iterable – 可迭代对象。 key – 主要是用来进行比较的元素&#xff0c;只有一个参数&#xff0c;具体的函数的参数就是取自于可迭代对象中&#xff0c;指定可迭代对象中的…

springboot整合minio最新版

第一步&#xff1a;查找minio最新依赖&#xff0c;通过maven查询网站查询,这搜索框输入minio&#xff0c; 也可以查看MinIO官网https://docs.min.io/docs/java-client-quickstart-guide.html 如下: 点击minio进入查看maven依赖&#xff0c;可以看到最新版为8.3.4 <dependen…

学生学籍管理系统python_使用Python实现 学生学籍管理系统

大家好&#xff0c;今天跟大家分享一个用Python实现的学生学籍管理系统&#xff1a; 该代码主体由五个函数组成&#xff1a; 1.add_stu() 添加 2.del_stu() 删除 3.print_stu()打印 4.exit_stu() 退出 5.system() 主函数 1.add_stu() 此段函数作用&#xff1a;把输入的值存入字…