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

news2024/11/18 23:28:07

目录:

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

在这里插入图片描述

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

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

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

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


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

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

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

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

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

    在这里插入图片描述

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

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

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

    package org.springframework.boot.autoconfigure.cache;
    
    @Configuration
    class RedisCacheConfiguration {
    
        @Bean
        public 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 { 
    
        @Bean
        public 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序列化方式

    在这里插入图片描述

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

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

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

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

  • JDK 序列化机制缺点 :

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

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

    在这里插入图片描述

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

2.2 自定义 Redis API ( 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对象的配置类
            @Bean
      public 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类 ) 的 “Redis缓存管理” ,在 左边的项目代码基础上添加 RedisConfig.java 配置类启动该项目访问ulr,可以看到 Redis数据库中的数据为 JSON格式 ( 如下图所示 ),便于查看和管理,表明其实 序列化方式为 : JSON序列化方式

    在这里插入图片描述

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

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

相关文章

抽象代理模式2.0版本

前言&#xff1a; 1.0版本的核心 代理的定义 A proxy, in its most general form, is a class functioning as an interface to something else. The proxy could interface to anything: a network connection, a large object in memory, a file, or some other resource t…

金融级国产化替代中间件有哪些?

过去&#xff0c;国内中间件市场一直由IBM、Oracle等国际大型企业所主导&#xff0c;这在一定程度上限制了对国内企业多样化和个性化需求的满足&#xff0c;尤其是在实现底层硬件与上层应用软件之间高效、精准匹配方面。面对日益复杂的国际局势&#xff0c;金融安全已成为国家整…

akSmart大带宽服务器基础配置科普

在数字化时代&#xff0c;服务器的性能和网络带宽成为业务发展的关键因素。RakSmart作为知名的服务器提供商&#xff0c;其大带宽服务器备受用户青睐。那么&#xff0c;RakSmart大带宽服务器的基础配置究竟有哪些呢?本文将为您揭开这一神秘面纱。 首先&#xff0c;我们来看看R…

【基于YOLOv8的教室人脸识别 附源码 数据集】

基于YOLOv8的教室人脸识别 附源码 数据集 在当今数字化迅速发展的教育领域中&#xff0c;人脸识别技术已成为提高校园安全和教学效率的关键工具。本文将详细介绍基于最新YOLOv8算法的教室人脸识别系统&#xff0c;这一系统不仅能够实时准确地识别学生和教职工的面部特征&#…

【QT】ROS2 Humble联合使用QT教程

【QT】ROS2 Humble联合使用QT教程 文章目录 【QT】ROS2 Humble联合使用QT教程1. 安装ROSProjectManager插件2. 创建ROS项目3.一个快速体验的demoReference 环境的具体信息如下&#xff1a; ubunt 22.04ros2 humbleQt Creator 13.0.0ROS ProjectManager 13.0.0 本文建立在已经…

【A-034】基于SSH的电影订票系统(含论文)

【A-034】基于SSH的电影订票系统&#xff08;含论文&#xff09; 开发环境&#xff1a; Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库&#xff1a; MySQL 技术&#xff1a; SpringStruts2HiberanteJSPJquery 适用于&#xff1a; 课程设计&#xff0c;毕业设计&…

MacOS通过命令行开启关闭向日葵远程控制的后台服务

categories: [Tips] tags: MacOS Tips 写在前面 经常有小伙伴问我电脑相关的问题, 而解决问题的一个重要途径就是远程了. 关于免费的远程工具我试过向日葵和 todesk, 并且主要使用向日葵, 虽然 MacOS 下要设置很多权限, 但是也不影响其丝滑的控制. 虽然用着舒服, 但是向日葵…

【Elasticsearch<一>✈️✈️】简单安装使用以及各种踩坑

目录 &#x1f378;前言 &#x1f37b;一、软件安装&#xff08;Windows版&#xff09; 1.1、Elasticsearch 下载 2.1 安装浏览器插件 3.1、安装可视化工具 Kibana 4.1、集成 IK 分词器 &#x1f37a;二、安装问题 &#x1f379;三、测试 IK 分词器 ​&#x1f377; 四、章…

高端制造企业生产设备文件管理,怎样保证好用不丢失文件?

高端制造业在市场经济中占据重要角色&#xff0c;在高端制造业企业内部&#xff0c;生产设备又是最关键的一环环&#xff0c;它们不仅负责完成生产任务&#xff0c;同时也会产生大量的文件。这些数据反映了设备的运行状态、生产效率、能源消耗以及产品质量等多个方面&#xff0…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器&#xff1a;iOS上的复古游戏天堂 在数字时代&#xff0c;我们有时会怀念起那些早期的电子游戏&#xff0c;它们简单、纯粹&#xff0c;带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升&#xff0c;但那种复古的感觉却始终无法替代。幸运的是&a…

科技云报道:走入商业化拐点,大模型“开箱即用”或突破行业困局

科技云报道原创。 大模型加速狂飙&#xff0c;AI商业化却陷入重重困境。 一方面&#xff0c;传统企业不知道怎么将AI融入原始业务&#xff0c;另一方面&#xff0c;AI企业难以找到合适的商业化路径。 纵观海外AI玩家&#xff0c;已经有许多企业趟出了自己的商业化道路。 微…

C#从入门到精通:一场深入浅出的编程之旅【文末送书】

文章目录 C#从入门到精通入门篇进阶篇精通篇模式探索C#从入门到精通&#xff08;第7版&#xff09;&#xff08;软件开发视频大讲堂&#xff09;【文末送书】 C#从入门到精通 在当今数字化的时代&#xff0c;编程已经成为一项至关重要的技能。而在众多编程语言中&#xff0c;C…

人工智能|深度学习——多模态条件机制 Cross Attention 原理及实现

一、引入 虽然之前写过 Attention 的文章&#xff0c;但现在回头看之前写的一些文章&#xff0c;感觉都好啰嗦&#xff0c;正好下一篇要写的 Stable Diffusion 中有 cross-attention&#xff0c;索性就再单拎出来简单说一下 Attention 吧&#xff0c;那么这篇文章的作用有两个&…

微软在汉诺威工业博览会上推出新制造业Copilot人工智能功能,强化Dynamics 365工具集

在近日于德国汉诺威举行的盛大工业博览会上&#xff0c;微软向全球展示了其最新推出的制造业人工智能功能&#xff0c;这些功能以Dynamics 365工具集为核心&#xff0c;旨在通过先进的AI技术为制造业带来前所未有的变革。 此次推出的新功能中&#xff0c;最为亮眼的是支持AI的…

python 中使用 ESP8266 实现语音识别(或热词检测)

介绍 我的大部分家庭自动化都是通过对网络中的设备执行 HTTP 请求来控制的。 (例如:开灯、打开收音机、控制加热系统...... 这可以使用ESP8266轻松完成。我有一个控制器和一个触摸传感器,当我在床上时用它来控制灯光和音乐。 像 Amazon Echo 或 Google Homepod 一样添加语…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充&#xff0c;并且可以与任何提供currentIndex属性的布局或容器控件一起使用&#xff0c;例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …

【论文阅读】Self-DC:何时检索,何时生成?

对于RAG来说&#xff0c;什么时候利用外部检索&#xff0c;什么时候使用大模型产生已知的知识&#xff0c;以回答当前的问题?这是一个非常有趣的话题。 《Self-DC: When to retrieve and When to generate? Self Divide-and-Conquer for Compositional Unknown Questions》这…

Transformer step by step--Positional Embedding 和 Word Embedding

Transformer step by step往期文章&#xff1a; Transformer step by step--层归一化和批量归一化 要把Transformer中的Embedding说清楚&#xff0c;那就要说清楚Positional Embedding和Word Embedding。至于为什么有这两个Embedding&#xff0c;我们不妨看一眼Transformer的…

3.1设计模式——Chain of Responsibility 责任链模式(行为型)

意图 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系&#xff0c;将这些对象练成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个对象处理它为止。 实现 其中 Handle定义一个处理请求的接口&#xff1a;&#xff08;可选…

Java中的ArrayList集合

特点&#xff1a; ArrayList中的一些方法&#xff1a; 1、add(Object element):向集合的末尾添加元素 add(int index,Object element):在列表的指定位置&#xff08;从0开始&#xff09;插入指定元素 2、size():返回列表的中的元素个数 3、get(int index):返回下标为index位置的…