Spring Boot | Spring Boot “自定义“ Redis缓存 “序列化机制“

ops/2024/9/23 14:24:25/

目录:

  • Spring Boot "自定义" Redis缓存 "序列化机制" :
    • 一、基于 "注解" 的 "Redis缓存管理" 的 "默认序列化机制" 和 "自定义序列化机制"
      • 1.1 基于 "注解" 的 "Redis缓存管理" 的 "默认序列化机制"
      • 1.2 自定义 基于"注解" "Redis缓存管理" 的 "序列化机制" ( 自定义一个 "RedisCacheManager对象" , 在该对象中进行 "序列化" 的 "自定义" )
    • 二、Redis API ( RedisTemplate类>RedisTemplate类 ) 的 "默认序列化机制" 和 "自定义序列化机制"

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


Spring Boot “自定义” Redis缓存 “序列化机制” :

一、基于 “注解” 的 “Redis缓存管理” 的 “默认序列化机制” 和 “自定义序列化机制”

1.1 基于 “注解” 的 “Redis缓存管理” 的 “默认序列化机制”

  • 在 基于 “注解” 的 “Redis缓存管理” 中我们已经实现了在 Spring Boot 中使用 Redis 来进行 数据 “缓存管理”,此时 缓存管理 的使用的 序列化机制为 : JDK 序列化机制 ,如下图所示

    ( Redis API默认序列化机制 为 : JDK序列化机制 )。

    在这里插入图片描述

    可通过 JSON格式的 "序列化机制"解决这个问题

CacheManager_______39">1.2 自定义 基于"注解" “Redis缓存管理” 的 “序列化机制” ( 自定义一个 “RedisCacheManager对象” , 在该对象中进行 “序列化” 的 “自定义” )

  • 打开 Spring Boot 整合 Redis 组件提供的缓存自动配置类RedisCacheConfiguration (org.springframework.boot.autoconfigure.cache 下的),查看该类源码信息,其 核心代码 如下 :

    package org.springframework.boot.autoconfigure.cache;@Configuration
    class RedisCacheConfiguration {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory, ResourceLoader resourceLoader) {RedisCacheManagerBuilder builder =            RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(this.determineConfiguration(resourceLoader.getClassLoader()));List<String> cacheNames = cacheProperties.getCacheNames();if (!cacheNames.isEmpty()) {builder.initialCacheNames(new LinkedHashSet(cacheNames));}return (RedisCacheManager)cacheManagerCustomizers.customize(builder.build());}.....private org.springframework.data.redis.cache.RedisCacheConfiguration createConfiguration(ClassLoader classLoader) {CacheProperties.Redis redisProperties = cacheProperties.getRedis();org.springframework.data.redis.cache.RedisCacheConfiguration config = org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig();config = config.serializeValuesWith(SerializationPair.fromSerializer(new JdkSerializationRedisSerializer(classLoader))); .....return config;}
    }
    

    上述核心源码中可以看出,同 RedisTemplate 核心源码 类似RedisCacheConfiguration 内部同样通过 RedisConnectionFactory ( Redis连接工厂 ) 定义了一个 RedisCacheManager ( 缓存管理器 ) ; 同时定制 RedisCacheManager 时,使用了 默认JdkSerializationRedisSerializer ( JDK序列化机制 ) 。


    如果想要使用 自定义序列化方式RedisCacheManager进行数据缓存操作,可以参考上述核心代码创建一个名为 cacheManager
    Bean组件,并在该组件设置对应序列化方式 即可。

  • 通过 自定义 RedisCacheManager对象 来 “自定义序列化机制” ( 自定义 基于 “注解” 的 “Redis缓存管理” 的 “序列化机制” ) :

    RedisConfig.java : ( 添加配置类,即可实现 JSON序列化机制 )

    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.cache.RedisCacheConfiguration;
    import org.springframework.data.redis.cache.RedisCacheManager;
    import org.springframework.data.redis.connection.RedisConnectionFactory;
    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.RedisSerializationContext;
    import org.springframework.data.redis.serializer.RedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;@Configuration //标记该类为"配置类"
    public class RedisConfig { @Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {//分别创建String 和 JSON格式的 "序列化对象" , 对缓存数据key和value进行转换/*** "String格式序列化机制" ---用在存储的"缓存数据"的key*/RedisSerializer<String> strSerializer = new StringRedisSerializer();//解决查询缓存转换异常的问题ObjectMapper objectMapper  = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);/*使用"JSON格式序列化机制" 对缓存数据key和value进行转换 ---用在存储的"缓存数据"的value*/Jackson2JsonRedisSerializer jsonSerializer = new Jackson2JsonRedisSerializer(objectMapper,Object.class);/*定制"缓存数据序列化方式"及"时效"*/RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1)) //"缓存数据"的"持续时效".serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(strSerializer))//设置key的"序列化机制".serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jsonSerializer))//设置value的"序列化机制".disableCachingNullValues();//创建RedisCacheManager对象RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();return redisCacheManager;}
    }
    

    上述代码中,在 RedisConfig 配置类中使用 @Bean 注解注入了一个默认名称方法名cacheManager 组件
    定义的 Bean 组件中,通过 RedisCacheConfiguration 对缓存数据的 keyvalue 分别进行了序列化方式的定制,其中缓存数据的 key定制为 StringRedisSerializer(即String 格式),而 value 定制为了 Jackson2JsonRedisSerializer(即 JSON 格式 ),同时还使用entryTtl ( Duration.ofDays(1) ) 方法将 缓存数据有效期 设置为 1天。最后创建 RedisCacheManager对象


    基于 “注解” 的 “Redis缓存管理” ,在 左边的项目代码基础上添加 RedisConfig.java 配置类启动该项目访问ulr,可以看到 Redis数据库 中的数据为 JSON格式 ( 如下图所示 ),便于查看和管理,表明其实 序列化方式为 : JSON序列化方式

    在这里插入图片描述

RedisTemplate________147">二、Redis API ( RedisTemplate类>RedisTemplate类 ) 的 “默认序列化机制” 和 “自定义序列化机制”

RedisTemplate____149">2.1 Redis API ( RedisTemplate类>RedisTemplate类 ) 的 “默认序列化机制”

  • 在 基于 “API” ( RedisTemplate类>RedisTemplate类 ) 的 “Redis缓存管理” 中我们已经实现了在 Spring Boot 中使用 Redis 来进行 数据
    “缓存管理”,此时 缓存管理的使用的 序列化机制 为 : JDK 序列化机制

    ( Redis API默认序列化机制 为 : JDK序列化机制 )。

  • JDK 序列化机制缺点 :

    实体类中 要 实现 "Serializable接口" ,以此对数据进行"序列化"。

    不便于使用可视化管理工具进行查看管理 ( 即此时Redis数据库可视化界面看到都是一些 Hex 格式的数据 ( 或者 二进制格式 / 其他格式 ),都 不是一些明细可视化的数据 ),如下图所示

    在这里插入图片描述

    可通过 JSON格式的 "序列化机制"解决这个问题

RedisTemplate______RedisTemplate_____171">2.2 自定义 Redis API ( RedisTemplate类>RedisTemplate类 ) 的 “序列化机制” ( 自定义一个"RedisTemplate"对象,在该对象中进行 “序列化” 的 “自定义” )

  • 项目中引入 Redis 依赖 后,Spring Boot 提供的 RedisAutoConfiguration 自动配置生效 ( Redis自动配置类 生效)。

    打开RedisAutoConfiguration 类查看内部源码 中关于 RedisTemplate定义方式核心代码如下所示 :

    public class RedisAutoConfiguration {@Bean@ConditionalOnMissingBean( name = {"redisTemplate"} )public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> template = new RedisTemplate();template.setConnectionFactory(redisConnectionFactory);return template;}.....
    }
    

    从上述 RedisAutoConfiguration 核心源码中可以看出,在 Redis 自动配置类 中,通过 RedisConnectionFactory ( Redis连接工厂对象 ) 初始化 了一个 RedisTemplate 对象 ( Redis模板对象 )。

    RedisTemplate上方添加了 @ConditionalOnMissingBean 注解( 顾名思义,当某个 Bean 不存在时生效 ),用来 表明如果 开发者自定义了一个名为 redisTemplateBean,则 RedisTemplate使用自定义Bean

  • 如果 想要使用自定义序列化方式的 RedisTemplate对象 进行数据缓存操作,可以参考上述核心创建一个名为 redisTemplate 对象Bean 组件,并 在该组件中 设置 对应的序列化方式 ( JSON序列化方式 ) 即可。

    配置类代码例子如 :

    RedisConfig.java

    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;@Configuration //标记该类为"配置类",定义一个配置类public class RedisConfig { //关于RedisTemplate对象的配置类@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { //参数为: Redis连接工厂对象//创建RedisTemplate对象RedisTemplate<Object, Object> redisTemplate = new RedisTemplate();//设置Redis连接工厂对象redisTemplate.setConnectionFactory(redisConnectionFactory );//设置解决缓存异常问题ObjectMapper objectMapper  = new ObjectMapper();objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);/*使用"JSON格式序列化机制" 对缓存数据key和value进行转换*/Jackson2JsonRedisSerializer jsonRedisSerializer = new Jackson2JsonRedisSerializer(objectMapper,Object.class);//设置RedisTemplate对象的"序列化机制" 为 "JSON序列化机制"redisTemplate.setDefaultSerializer(jsonRedisSerializer);return redisTemplate;}}
    

    在上面的代码中,使用 自定义Jackson2JsonRedisSerializer数据序列化方式自定义一个 RedisTemplate,在定制序列化方式中,定义一个ObjectMapper 用于进行数据转换设置


    基于 “API” ( RedisTemplate类>RedisTemplate类 ) 的 “Redis缓存管理” ,在 左边的项目代码基础上添加 RedisConfig.java 配置类启动该项目访问ulr,可以看到 Redis数据库中的数据为 JSON格式 ( 如下图所示 ),便于查看和管理,表明其实 序列化方式为 : JSON序列化方式

    在这里插入图片描述


http://www.ppmy.cn/ops/16481.html

相关文章

奇怪的 NRST 管脚异常复位问题

1. 引言 本文探讨一个奇怪的 MCU NRST 管脚异常复位现象。 2. 复位问题及排查 这个问题是客户对开发的平台做 EMS 浪涌测试的时候发生的&#xff0c; 平台上使用了一个STM32G474 RCT6 MCU 。在某个等级的 EMS 测试中&#xff0c; 客户发现 MCU 有时候会异常复位而影响平台的…

汽车组装3D电子说明书更通俗易懂

激光打印机由于造价高、技术更先进&#xff0c;因此在使用和维护上需要更专业的手法&#xff0c;而对于普通客户来说并不具备专业操作激光打印机的技能&#xff0c;为了通俗易懂地让客户理解激光打印机&#xff0c;我们为企业定制了激光打印机3D产品说明书&#xff0c;将为您带…

专项技能训练五《云计算网络技术与应用》实训6-2:ryu控制器安装

文章目录 ryu控制器安装1. 使用VMware安装CentOS 7虚拟机&#xff0c;安装时需添加多一张网卡&#xff0c;该网卡为自定义-VMnet1.并且记得开启CPU虚拟化&#xff0c;将其命名为“OVS1”。2. 安装完虚拟机后&#xff0c;进入虚拟机&#xff0c;修改网络配置&#xff08;onboot改…

如何安装sbt(sbt在ubuntu上的安装与配置)(有详细安装网站和图解)

sbt下载官网 选择对应的版本和安装程序 Download | sbt (scala-sbt.org) 安装 解压 将sbt-1.6.1.tgz上传到xshell&#xff0c;并解压 解压&#xff1a; tar -zxvf sbt-1.9.0.tgz 配置 1、在/home/hadoop/sbt中创建sbt脚本 /home/hadoop/sbt 注意要改成自己的地址 cd …

STM32之HAL开发——FSMC控制带控制器LCD(8080时序)

STM32FSMC模拟8080接口时序 ILI9341的8080通讯接口时序可以由STM32使用普通I/O接口进行模拟&#xff0c;但这样效率太低&#xff0c;STM32提供了一种特别的控制方法——使用FSMC接口实现8080时序。 由于FSMC外设可以用于控制扩展的外部存储器&#xff0c;而MCU对液晶屏的操作实…

33 http、服务器、php

1.1 http 超文本传输协议&#xff0c;基于请求和响应的一种传输规则 请求&#xff1a;发送一些信息给服务器地址-->url地址 url语法&#xff1a; http:// ip地址&#xff1a;网络中某一台计算机的身份证号 端口号&#xff1a;在一台计算机中某个软件的编号 文件路径&a…

【MySQL】MySQL操作库

【MySQL】MySQL操作库 ​ 本文带着大家一起了解MySQL的基本使用与操作库。首先我们连接MySQL的服务器&#xff1a; # 如果没有写 -h 127.0.0.1 默认是连接本地 # 如果没有写 -P 3306 默认是连接3306端口号 mysql -h 127.0.0.1 -P 3306 -u root -p​ 然后我们开始了解MySQL中关…

「 网络安全常用术语解读 」SBOM主流格式SPDX详解

SPDX&#xff08;System Package Data Exchange&#xff09;格式是一种用于描述软件组件&#xff08;如源代码&#xff09;的规范&#xff0c;它提供了一种标准化的方法来描述软件组件的元数据&#xff0c;包括其许可证、依赖项和其他属性。SPDX最初由Linux基金会于2010年发起&…