重学SpringBoot3-集成Redis(三)之注解缓存策略设置

news2024/10/9 16:15:12

更多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/2199456.html

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

相关文章

重塑能源持续亏损近22亿:今年前五个月销量下滑,产能利用率骤降

《港湾商业观察》黄懿 9月2日&#xff0c;上海重塑能源集团股份有限公司&#xff08;下称“重塑能源”&#xff09;向港交所提交上市申请书&#xff0c;委任中国国际金融香港证券有限公司、招银国际融资有限公司及法国巴黎证券&#xff08;亚洲&#xff09;有限公司为整体协调…

Linux(不同版本系统包含Ubuntu)下安装mongodb详细教程

一、下载MongoDB 在MongoDB官网下载对应的MongoDB版本&#xff0c;可以点击以下链接快速跳转到下载页面&#xff1a; mongodb官网下载地址 注意选择和自己操作系统一致的platform,可以先查看自己的操作系统 查看操作系统详情 命令&#xff1a; uname -a 如图&#xff1a;操…

海洋大地测量基准与水下导航系列之二国外海底大地测量基准和海底观测网络发展现状(下)

2004年&#xff0c;英国、德国、法国等国家在欧洲“全球环境与安全监测’(Global Monitoring for Environment and Security,GMES)观测计划倡导下制定了“欧洲海底观测网络”(European Seafoor Observatory Network,ESONET)计划。ESONET是一个多学科的欧洲卓越网络(NoE &#x…

光路科技以技术创新为驱动,打造创新型企业新标杆

近日&#xff0c;深圳市光路在线科技有限公司&#xff08;光路科技&#xff09;凭借其出色的创新能力和市场表现&#xff0c;荣获深圳市中小企业服务局颁发的“创新型中小企业”称号。这一荣誉标志着光路科技在推动行业发展和技术进步方面取得了显著成就。 光路科技自2008年成立…

【含文档】基于Springboot+Android的在线招聘平台(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

◇【code】PPO: Proximal Policy Optimization

整理的代码库&#xff1a;https://github.com/Gaoshu-root/Code-related-courses/tree/main/RL2024/PPO OpenAI 文档 —— PPO-Clip OpenAI 文档 界面链接 PPO&#xff1a; on-policy 算法、适用于 离散 或 连续动作空间。可能局部最优 PPO 的动机与 TRPO 一样&#xff1a;…

Scott Brinker:企业正在更换更多的Martech,专注集成和API,不断扩大技术栈

营销技术替代因素&#xff1a;集成和API排在第二位 MarTech.org组织了2024年Martech替代调查&#xff0c;它能够深入了解营销技术栈是如何演变的。在496名受访者中&#xff0c;有65%的人表示他们在过去一年中更换了他们技术栈中的一个或多个营销技术解决方案。这些是最常被替代…

Tableau|三 数据连接与管理

一 Tableau的数据架构 数据连接层&#xff08;Connection&#xff09;、数据模型层&#xff08;DataModel&#xff09;和数据可视化层&#xff08;VizQL&#xff09;。 1.数据连接层 决定了如何访问源数据和获取哪些数据。 数据连接层的数据连接信息包括数据库、数据表、数据视…

华为大咖说 | 新时代,智能电动车车联网有哪些发展趋势?(下篇)

本文作者&#xff1a;朱行健&#xff08;华为专家&#xff09;全文约4252字&#xff0c;阅读约需9分钟 近年来&#xff0c;汽车产业逐步向电动化、自动化、网联化、共享化发展&#xff0c;车联网开始成为新的竞争主体&#xff0c;汽车市场开始出现新的市场发展驱动力、形成新的…

E36.C语言模拟试卷1第一大题选题解析与提示(未完)

点我去下载C语言模拟试卷1的文件 备注:ZIP文件中的参考答案仅仅提供最终结果 目录 第3题 第5题 第7题 第9题 第14题 第16题 第19题 第20题 第22题 第24题 第26题 第27题 第28题 第3题 3.若有说明语句&#xff1a;char c ‘\64’ ; 则变量C包含&#xff1a; …

python19_加减乘除(二)

加减乘除 a hello b world c 2 d 4# 字符串加法 def str_add(A, B):result A Breturn result# 字符串乘法 def str_mul(A, B):result A * Breturn result# 字符串除法 def str_div(A, B):result B / Areturn result# 字符串减法 def str_sub(A, B):result B - Aretur…

A股牛市来袭,资本涌动:加密市场的出路与机遇

近期&#xff0c;随着A股的强劲反弹&#xff0c;不少加密市场的投资者&#xff0c;尤其是一些KOL&#xff08;关键意见领袖&#xff09;&#xff0c;开始转移资金并公开建议进军A股。这种趋势反映出部分投资者对加密市场的信心动摇&#xff0c;尤其是在全球宏观经济不确定性加剧…

python兴农购物网站系统—计算机毕业设计源码38256

摘 要 助农工作是当前我国全面建成小康社会的重点工作&#xff0c;由于我国农村地域广大&#xff0c;贫困人口多&#xff0c;区域差异大&#xff0c;因此&#xff0c;不同区域的扶贫方法也是不一样的。近年来&#xff0c;随着网络的普及。许多农村地区物产丰富&#xff0c;但由…

【解决方案】基于数据库驱动的自定义 TypeHandler 处理器

前言 笔者在最近的项目开发中&#xff0c;频繁地遇到了 Java 类型与 JDBC 类型之间的2个转换问题&#xff1a; 数据库的 varchar 类型字段&#xff0c;需要存储 Java 实体中的 JSON 字符串 数据库的 int 类型字段&#xff0c;需要存储 Java 实体中的 Enum 枚举 其实要处理也不…

数据库软题6.2-关系模式-范式

一、判断部分函数依赖&#xff08;1NF有部分函数依赖&#xff09; 题型&#xff1a;给出函数依赖集和属性&#xff0c;判断该关系模式属于第几范式。 求出候选码 若是候选码为属性的组合&#xff0c;则可能有部分函数依赖&#xff1b;&#xff08;存在部分函数依赖&#xff0…

苹果AI重磅升级!ChatGPT正式登陆iPhone,开启智能生活新时代

苹果AI重磅升级&#xff01;ChatGPT正式登陆iPhone&#xff0c;开启智能生活新时代 在今年的全球开发者大会&#xff08;WWDC 2024&#xff09;上&#xff0c;苹果公司引爆了科技圈——通过与OpenAI合作&#xff0c;苹果宣布将人工智能技术与iPhone深度融合。通过这个合作&…

自由学习记录(2)

Unity打包图集相关 Draw Call 实验设置&#xff1a; 我们将创建两个场景&#xff0c;一个场景有高 Draw Call&#xff0c;另一个场景通过优化减少 Draw Call。然后对比它们的帧率&#xff08;FPS&#xff09;。 场景 1&#xff1a;高 Draw Call 场景&#xff08;无优化&…

浙大数据结构:07-图5 Saving James Bond - Hard Version

这道题也是很有难度&#xff0c;我最开始尝试用Dijkstra来做&#xff0c;发现不是很好处理&#xff0c;用bfs还不错。 机翻&#xff1a; 1、条件准备 n为鳄鱼数量&#xff0c;jump为跳跃距离&#xff0c;headjump为第一次跳跃距离&#xff0c;包括了岛的半径。 isalive标识…

求职书与求职经历 - Chap01.

节前定点在智联投了几家&#xff0c;智联上之前的简历还在&#xff0c;稍稍维护了一下&#xff0c;现在有两三家再看看。然后节后&#xff0c;今天&#xff0c;注册了职友网的7天会员。正在整理简历。 专利证书&#xff0c;通过soopat查&#xff0c;很不友好。国家产权局后来直…

docker部署langfuse 本地

下载langfuse地址:https://api.github.com/repos/langfuse/langfuse/tarball/v2.43.2 tips&#xff1a;这里有的博主说需要clone到本地&#xff0c;但是我的docker clone langfuse到本地使用docker安装页面提示如下错误: 最后使用下载地址 上传到服务器后 解压再安装 反正没有…