重学SpringBoot3-集成Redis(三)

news2024/11/26 14:45:56

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-集成Redis(三)

  • 1. 引入 Redis 依赖
  • 2. 配置 `RedisCacheManager` 及自定义过期策略
    • 2.1 示例代码:自定义过期策略
  • 3. 配置说明
  • 4. 使用自定义的缓存区域
  • 5. 验证
  • 6. 总结

书接上回,重学SpringBoot3-集成Redis(二), Spring Boot 提供了对缓存的简便支持,使得开发者能够通过简单的注解实现缓存操作,减少重复代码的编写。本文将继续介绍如何在 Spring Boot 3 中通过注解驱动的方式针对不同缓存区域设置不同缓存策略

在 Spring Boot 3 中,使用 RedisCacheManager 可以为不同的缓存区域(缓存名称)设置自定义的过期策略。通过为每个缓存区域创建不同的 RedisCacheConfiguration,你可以指定不同的过期时间(TTL)和其他缓存行为。以下是如何为不同的缓存区域设置自定义过期策略的详细说明。

1. 引入 Redis 依赖

首先确保你的 pom.xmlbuild.gradle 文件中已经引入了 Redis 相关的依赖。以 Maven 为例:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>

2. 配置 RedisCacheManager 及自定义过期策略

通过创建自定义的 CacheManager,你可以为不同的缓存名称指定不同的 RedisCacheConfiguration,每个配置可以有不同的过期时间或序列化规则。

2.1 示例代码:自定义过期策略

package com.coderjia.boot310redis.config;

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

/**
 * @author CoderJia
 * @create 2024/10/5 下午 12:36
 * @Description
 **/
@Configuration
public class CacheConfig {

    // @Bean
    // public RedisCacheConfiguration cacheConfiguration() {
    //     return RedisCacheConfiguration.defaultCacheConfig()
    //             .prefixCacheNameWith("coderjia:")  // 设置缓存 Key 前缀
    //             .entryTtl(Duration.ofMinutes(10))  // 设置缓存过期时间为 10 分钟
    //             .disableKeyPrefix()
    //             .enableTimeToIdle()
    //             .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 自定义 Key 序列化器
    //             .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // 自定义 Value 序列化器
    // }

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

        // 创建默认的 RedisCacheConfiguration,并设置全局缓存过期时间
        RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(5))  // 默认全局缓存过期时间为5分钟
                .disableCachingNullValues();      // 禁止缓存 null 值

        // 为特定缓存配置不同的过期策略
        Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();

        // 配置名为 "shortLivedCache" 的缓存,设置过期时间为1分钟
        cacheConfigurations.put("shortLivedCache",
                RedisCacheConfiguration.defaultCacheConfig()
                        .entryTtl(Duration.ofMinutes(1)) // 设置缓存的TTL为1分钟
                        .disableCachingNullValues());    // 禁止缓存 null 值

        // 配置名为 "longLivedCache" 的缓存,设置过期时间为1小时
        cacheConfigurations.put("longLivedCache",
                RedisCacheConfiguration.defaultCacheConfig()
                        .entryTtl(Duration.ofHours(1))  // 设置缓存的TTL为1小时
                        .disableCachingNullValues());    // 禁止缓存 null 值

        // 配置名为 "jsonCache" 的缓存,使用 JSON 序列化器
        cacheConfigurations.put("jsonCache",
                RedisCacheConfiguration.defaultCacheConfig()
                        .entryTtl(Duration.ofMinutes(30))  // 30分钟过期
                        .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
                        .disableCachingNullValues());       // 禁止缓存 null 值

        // 创建 RedisCacheManager,加载自定义的缓存配置
        return RedisCacheManager.builder(redisConnectionFactory)
                .cacheDefaults(defaultCacheConfig)   // 设置默认的缓存配置
                .withInitialCacheConfigurations(cacheConfigurations) // 加载不同缓存区域的配置
                .build();
    }
}

3. 配置说明

  • defaultCacheConfig:这是默认的缓存配置,用于所有未显式定义的缓存区域。在上面的例子中,默认的 TTL 是 5 分钟。

  • cacheConfigurations.put("shortLivedCache", ...):为缓存名为 "shortLivedCache" 的区域设置了特定的过期时间为 1 分钟。这意味着,当你使用 @Cacheable 指定该缓存时,它的 TTL 将为 1 分钟。

  • cacheConfigurations.put("longLivedCache", ...):为缓存名为 "longLivedCache" 的区域设置了 1 小时的 TTL。这非常适合需要长时间保留的数据。

  • cacheConfigurations.put("jsonCache", ...):这个缓存区域使用 JSON 序列化器。这样可以确保键和值的序列化与反序列化是通过 JSON 格式完成的。

4. 使用自定义的缓存区域

在代码中使用这些自定义的缓存区域时,你可以通过 @Cacheable 注解指定不同的缓存名称。

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    // 当方法第一次调用时,结果将被缓存起来,之后相同参数的调用将直接从缓存中获取数据
    @Cacheable(value = "user", key = "#p0")
    public User getUserById(Long id) {
        // 模拟数据库查询操作
        System.out.println("Fetching user with id: " + id);
        return new User(id, "User" + id);
    }

    // 使用短生命周期的缓存配置(1分钟)
    @Cacheable(value = "shortLivedCache", key = "#p0")
    public User getShortLivedUserById(Long id) {
        return findUserInDatabase(id);
    }

    // 使用长生命周期的缓存配置(1小时)
    @Cacheable(value = "longLivedCache", key = "#p0")
    public User getLongLivedUserById(Long id) {
        return findUserInDatabase(id);
    }

    // 使用 JSON 序列化的缓存(30分钟)
    @Cacheable(value = "jsonCache", key = "#p0")
    public User getJsonSerializedUserById(Long id) {
        return findUserInDatabase(id);
    }

    private User findUserInDatabase(Long userId) {
        // 模拟数据库查找
        return new User(userId, "John Doe");
    }
}

5. 验证

当调用 getUserById 时,缓存数据会存储在默认的缓存区域,数据会在 5 分钟后过期。

默认的缓存区域

调用 getShortLivedUserById 时,数据会在 1 分钟后自动失效。

shortLivedCache

调用 getLongLivedUserById 时,缓存数据会在 1 小时后失效。

longLivedCache

getJsonSerializedUserById 方法将数据以 JSON 格式序列化,并在 30 分钟后过期。

jsonCache

6. 总结

通过 RedisCacheManagerRedisCacheConfiguration,你可以为不同的缓存区域设置不同的 TTL、序列化策略、以及缓存行为。这样可以根据不同的业务场景调整缓存的生命周期,优化应用的性能。

为了更进一步完整代码,可以将缓存名称和对应有效期放入都配置文件中,更有利于线上环境根据实际情况调整缓存有效期,示例如下:

@Value("${cache.shortLiveCache.name}")
private String shortLiveCacheName;

@Value("${cache.shortLiveCache.ttl}")
private long shortLiveCacheTtl;

RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
        .cacheName(shortLiveCacheName)
        .enableTimeToIdle(true)
        .tti(Duration.ofSeconds(shortLiveCacheTtl));

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

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

相关文章

大学生就业招聘系统:Spring Boot技术解析

3系统分析 3.1可行性分析 通过对本大学生就业招聘系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本大学生就业招聘系统采用JAVA作为开发语言&#xff0c;S…

【现代控制理论】第2-5章课后题刷题笔记

文章目录 第二章&#xff1a;线性控制系统的状态空间描述第三章&#xff1a;控制系统状态空间描述的特性3.1 计算状态转移矩阵&#xff08;矩阵指数函数&#xff09;3.2 计算系统的时间响应&#xff08;状态方程的解&#xff09;3.3 判断系统的能控性和能观性&#xff0c;以及能…

【笔记】I/O总结王道强化视频笔记

文章目录 从中断控制器的角度来理解整个中断处理的过程复习 处理器的中断处理机制**中断驱动I/O方式** printf——从系统调用到I/O控制方式的具体实现1轮询方式下输出一个字符串(程序查询)中断驱动方式下输出一个字符串中断服务程序中断服务程序与设备驱动程序之间的关系 DMA方…

【测试】接口测试与接口自动化

壹、接口测试基础 一、接口测试概念 I、基础概念 是测试系统组件间接口的一种测试。 主要用于检测外部系统与系统间、内部子系统间的交互点&#xff1b;测试重点检查数据的交换、传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系。 内部接口调用相当于函数调用&am…

C语言基础(9)之指针(1)

目录 1. 指针的概念 1.1 内存 1.2 指针是什么 1.3 指针变量的大小 2. 指针类型 2.1 指针类型的意义 2.2 指针类型意义的疑问 3. 野指针 3.1 野指针的概念 3.2 野指针的成因 3.3 如何规避野指针 4. 指针运算 4.1 指针 或 - 整数 4.2 指针 - 指针 4.3 指…

国庆普及模拟赛-5

题目链接&#xff1a; file:///C:/Users/Administrator/Desktop/%E4%B8%8B%E5%8F%91%E6%96%87%E4%BB%B61005/20241005.pdf T1&#xff1a; 题目分析&#xff1a;不需要进行模拟&#xff0c;想要获得分数最大化&#xff0c;只需要将大的数据相加&#xff0c;再减去小的数据。 …

AD7606 ADC的SPI驱动——FPGA学习笔记17

素材来源 米联客 一、AD7606简介 功能框图&#xff1a; 转换控制时序&#xff1a; AD7606 支持 2 种时序转换&#xff0c; 由于我们采用的时串行 SPI 模式&#xff0c; 本身 SPI 读取数据就会耽误很多时间&#xff0c; 所以必须采用第二种工作时序&#xff0c; 才…

呆仔君最新可用版本及作废版本说明截止日期10.5

呆仔君最新可用版本及作废版本说明 当前最新可用版本为 5.0 及以上版本。 截至今天&#xff0c;最新版本为 5.3。本次 5.3 版本的更新功能如下&#xff1a; 新增清悦阁&#xff08;用于搜歌&#xff09;新增手绘功能新增语音合成&#xff08;包括卢本伟、刘华强、特朗普等人物…

[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠

[大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠 目录 文章目录 [大语言模型-论文精读] 更大且更可指导的语言模型变得不那么可靠目录0. 摘要1. 核心内容3. 创新点4. 算法模型5. 实验效果6. 重要数据与实验结论7. 推荐阅读指数&#xff1a;8. 推荐理由 后记 论文…

【Java】—— 集合框架:Collections工具类的使用

目录 7. Collections工具类 7.1 常用方法 7.2 举例 7.3 练习 7. Collections工具类 参考操作数组的工具类&#xff1a;Arrays&#xff0c;Collections 是一个操作 Set、List 和 Map 等集合的工具类。 7.1 常用方法 Collections 中提供了一系列静态的方法对集合元素进行排序…

超声波清洗机什么牌子值得入手?推荐四款入手不亏的眼镜清洗机

在当今这个注重细节完美的时代&#xff0c;超声波清洗机凭借其卓越的清洁效率、深层渗透力及细腻的清洗效果&#xff0c;迅速赢得了家庭与专业场景的青睐。无论是精细的珠宝、眼镜框&#xff0c;还是金属装饰品、电子设备乃至医疗器具&#xff0c;超声波技术都能精准祛除隐秘处…

汇编语言笔记2

7.MASM,NASM,ATT,ARM的介绍 MASM:Windows下编译汇编指令的软件,可以在DOSBox下运行 NASM:优化版的MASM,主要用于Linux操作系统 ATT:Linux默认的汇编风格(但不友好) ARM:非PC(IOT设备)的汇编,比如写51单片机打开keil4的界面可以看到ARM 8.汇编 C语言 C 之间的关系 发展历程…

45集 ESP32 ADC按键程序编写

45集 ESP32 ADC按键程序编写 参考例程是 D:\Espressif\esp-adf\examples\checks\check_board_buttons 1、config 这个向下兼容的要加上&#xff0c;如果不加会有错误。 CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITYy 2、程序里面引入如下头文件 #include “periph_adc_but…

Python+Matplotlib可视化y = e^(1/x)函数

可视化y e^(1/x)函数&#xff1a; import numpy as np import matplotlib.pyplot as pltplt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] Falsefig, ax plt.subplots(figsize(12, 8))def e_to_1_over_x(x):return np.where(x ! 0, np.exp(1/x), …

C初阶(十二)do - while循环 --- 致敬革命烈士

大家国庆看阅兵仪式和天安门升旗仪式了吗&#xff1f;岁月安好&#xff0c;只因有人负重前行。 ————山那边是什么 ————是烈士的英魄 ————是他们拼死保卫的新中国 ————河那边是什么 ————是绵延的战火 ————她望着远方泪一滴滴的落 ————和平来了 ——…

Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;在学习了Arduino的相关基础知识后&#xff0c;现在做个综合应用&#xff0c;给旋转的电机测速。 1.实验目的 测定旋转电机的转速。 2.实验器材-编码器 …

比较搜索难度曲线5s1-4和4s1

在行列可自由变换的条件下&#xff0c;平面上的5点结构只有34个,4点结构有16个 (A,B)---6*n*2---(0,1)(1,0) 让B全是0。当收敛误差为7e-4&#xff0c;收敛199次取迭代次数平均值。让隐藏层节点数n分别为10&#xff0c;15&#xff0c;20&#xff0c;25&#xff0c;30&#xff…

一些关于上传数据-p7zip-full-压缩包的经验

目录 前言 7z 简介 Windows如何压缩tar.gz格式 一、下载7-ZIP 二、tar文件进一步压缩 说明&#xff1a; 前言 本人每次在linux服务器上执行apt-get install p7zip-full命令&#xff0c;都会有复杂依赖报错&#xff08;因为实验过程中用到的依赖包太多了&#xff09;&…

今日指数项目个股周K线功能实现

个股周K线功能实现 1 个股周K线功能实现功能分析 1&#xff09;个股周K线功能原型分析 2&#xff09;个股周K线功能接口分析 个股周K线数据主要包含&#xff1a; 股票ID、 一周内最高价、 一周内最低价 、周1开盘价、周5的收盘价、 整周均价、以及一周内最大交易日期&#x…

【Linux】-----进程第二弹(优先级,环境变量)

目录 一、进程优先级 是什么 为什么要有&#xff1f; 查看进程优先级 修改进程优先级 二、环境变量 命令行参数 概念 常见环境变量 查看环境变量 配置环境变量 内存级别修改&#xff08;命令行修改&#xff0c;暂时&#xff09; ①拷贝到系统路径下 ② 路径添加…