SpringBoot2.0版本自定义Redis序列化

2024-04-21 22:18

本文主要是介绍SpringBoot2.0版本自定义Redis序列化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题记

跟着B站的视频学着学着突然遇到版本问题,在SpringBoot1.0版本中,自定义Redis序列化操作特别简单,new一个自定义的RedisTemplate就好了,但是在SpringBoot2.0版本中,自定义Redis的序列化就变得稍微复杂一点。

出现的问题:

默认使用的序列器是JdkSerializationRedisSerializer,此序列化器导致下图结果,所以我们需要自定义序列化。
在这里插入图片描述

自定义序列化过程:

1. 先看默认序列化的实现

实现过程在org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration(自动配置组件)中

@BeanRedisCacheManager cacheManager(CacheProperties cacheProperties, CacheManagerCustomizers cacheManagerCustomizers,ObjectProvider<org.springframework.data.redis.cache.RedisCacheConfiguration> redisCacheConfiguration,ObjectProvider<RedisCacheManagerBuilderCustomizer> redisCacheManagerBuilderCustomizers,RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));List<String> cacheNames = cacheProperties.getCacheNames();if (!cacheNames.isEmpty()) {builder.initialCacheNames(new LinkedHashSet<>(cacheNames));}redisCacheManagerBuilderCustomizers.orderedStream().forEach((customizer) -> customizer.customize(builder));return cacheManagerCustomizers.customize(builder.build());}

其实这个方法的重点就在下面这句代码中:

	RedisCacheManagerBuilder builder = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(determineConfiguration(cacheProperties, redisCacheConfiguration, resourceLoader.getClassLoader()));

分析:
在这句代码中,代码结构就是使用建造者模式,创建出一个builder对象,之后需要用这个builder对象建造我们需要用于实现序列化的RedisCacheManager对象。生成创建者时涉及到的主要对象有CacheProperties ,RedisCacheConfiguration。而这两个对象中,cacheProperties是加载配置文件中的缓存配置的,与自定义实现序列化没啥关系,关键是RedisCacheConfiguration这个对象。
看看这个类注释怎么写的

/*** Immutable {@link RedisCacheConfiguration} helps customizing {@link RedisCache} behaviour such as caching* {@literal null} values, cache key prefixes and binary serialization. <br />* Start with {@link RedisCacheConfiguration#defaultCacheConfig()} and customize {@link RedisCache} behaviour from there* on.** @author Christoph Strobl* @author Mark Paluch* @since 2.0*/

简单翻译一下,RedisCacheConfiguration帮助自定义行为,如缓存值,缓存键前缀和二进制序列化。现在的任务就是搞清楚RedisCacheConfiguration实现序列化的过程,在RedisCacheConfiguration类中有两个成员变量:

	private final SerializationPair<String> keySerializationPair;private final SerializationPair<Object> valueSerializationPair;

这一看知道是用来实现序列化的,其中keySerializationPair的类型是String,valueSerializationPair的类型是Object,这就解释了为什么存入redis时,key是正常显示,而value是看不懂的转译后的序列字节码。所以我们需要自定义值的序列化。在类RedisCacheConfiguration中有一个serializeValuesWith方法,这个方法就实现了值序列化的过程。

	public RedisCacheConfiguration serializeValuesWith(SerializationPair<?> valueSerializationPair) {Assert.notNull(valueSerializationPair, "ValueSerializationPair must not be null!");//返回一个RedisCacheConfiguration对象,其中的valueSerializationPair是由参数传入的SerializationPair对象return new RedisCacheConfiguration(ttl, cacheNullValues, usePrefix, keyPrefix, keySerializationPair,valueSerializationPair, conversionService);}

在SerializationPair对象中有一个静态代码块,使用了适配器模式,提供了我们自定义序列化器的接口,我们只要把自定义的序列化器传进去就可以实现自定义序列化了。

	/*** Creates a {@link SerializationPair} adapter given {@link RedisSerializer}.** @param serializer must not be {@literal null}.* @return a {@link SerializationPair} adapter for {@link RedisSerializer}.*/static <T> SerializationPair<T> fromSerializer(RedisSerializer<T> serializer) {Assert.notNull(serializer, "RedisSerializer must not be null!");return new RedisSerializerToSerializationPairAdapter<>(serializer);}

2.自定义序列化

1.实现自定义RedisCacheConfiguration:
@Bean
public RedisCacheConfiguration myRedisCacheConfiguration() {//使用json序列化器RedisSerializer<Object> jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();//将选用的自定义序列化器传入SerializationPair.fromSerializer这个静态代码块中,从而得到一个SerializationPairRedisSerializationContext.SerializationPair<Object> serializationPair = RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer);//将SerializationPair用于存入Redis中值的序列化return RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(serializationPair);
}
2. 实现自定义RedisCacheManager:
    @Beanpublic RedisCacheManager myCacheManager(RedisConnectionFactory redisConnectionFactory) {//把前面自定义好的myRedisCacheConfiguration作为参数传入,最后使用创建者模式返回RedisCacheManager对象,实现自定义序列化RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(redisConnectionFactory).cacheDefaults(myRedisCacheConfiguration());RedisCacheManager cm = builder.build();return cm;}

这篇关于SpringBoot2.0版本自定义Redis序列化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Redis MCP 安装与配置指南

《RedisMCP安装与配置指南》本文将详细介绍如何安装和配置RedisMCP,包括快速启动、源码安装、Docker安装、以及相关的配置参数和环境变量设置,感兴趣的朋友一起看看吧... 目录一、Redis MCP 简介二、安www.chinasem.cn装 Redis MCP 服务2.1 快速启动(推荐)2.

在macOS上安装jenv管理JDK版本的详细步骤

《在macOS上安装jenv管理JDK版本的详细步骤》jEnv是一个命令行工具,正如它的官网所宣称的那样,它是来让你忘记怎么配置JAVA_HOME环境变量的神队友,:本文主要介绍在macOS上安装... 目录前言安装 jenv添加 JDK 版本到 jenv切换 JDK 版本总结前言China编程在开发 Java

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结