【Spring Boot】如何运用Spring Cache并设置缓存失效时间

  1. 简单描述
    1. Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。
    2. 常用注解
      1. 注解说明
        @EnableCaching开启缓存注解功能
        @Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,则调用方法并将方法返回值放到缓存中。常用于查询方法
        @CachePut将方法的返回值放到缓存中。常用于更新缓存
        @CacheEvict

        将一条或多条数据从缓存中删除。常用于失效缓存

  2. 在pom.xml文件中导入Spring Cache和Redis相关maven坐标
    1.         <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>
  3. 在启动类上加入@EnableCaching的缓存注解功能
    1. package com.app.studypro;import org.springframework.boot.SpringApplication;
      import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.boot.web.servlet.ServletComponentScan;
      import org.springframework.cache.annotation.EnableCaching;/*** 启动类* 注解@EnableCaching:开启缓存注解功能** @author Administrator*/
      @SpringBootApplication
      @ServletComponentScan
      @EnableCaching
      public class StudyProApplication {public static void main(String[] args) {SpringApplication.run(StudyProApplication.class, args);}}
      
  4. 若需要将数据存入缓存,则缓存对象一定要实现Serializable接口
    1. package com.app.studypro.common;import lombok.Data;@Data
      public class ResultBean<T> implements Serializable {private static final long serialVersionUID = -6759928086797729382L;}
      
  5. 统一归类管理Redis的cacheName缓存失效时间,并设置相应的缓存序列化器
    1. package com.app.studypro.config;import lombok.extern.slf4j.Slf4j;
      import org.springframework.cache.CacheManager;
      import org.springframework.cache.annotation.CachingConfigurerSupport;
      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.core.RedisTemplate;
      import org.springframework.data.redis.serializer.StringRedisSerializer;import java.time.Duration;
      import java.util.HashMap;
      import java.util.Map;/*** Redis的配置信息** @author Administrator*/
      @Configuration
      @Slf4j
      public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();log.info("Redis的KeySerializer设置为:{}", StringRedisSerializer.class);// 默认的Key序列化器为:JdkSerializationRedisSerializer// 将key的序列化器改为StringRedisSerializer,以便可以在Redis的key设置什么就显示什么,不进行转化redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}/*** 缓存管理** @return 返回缓存管理信息*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {// 缓存配置RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig()// 默认没有特殊指定的缓存,设置失效时间为1天.entryTtl(Duration.ofDays(1))// 在缓存名称前加上前缀.computePrefixWith(cacheName -> "default:" + cacheName);log.info("设置redis缓存的默认失效时间,失效时间默认为:{}天", defaultCacheConfig.getTtl().toDays());// 针对不同cacheName,设置不同的失效时间,map的key是缓存名称(注解设定的value/cacheNames),value是缓存的失效配置Map<String, RedisCacheConfiguration> initialCacheConfiguration = new HashMap<String, RedisCacheConfiguration>(8);// 设定失效时间为1小时initialCacheConfiguration.put("userCache", getDefaultSimpleConfiguration().entryTtl(Duration.ofHours(1)));// 设定失效时间为10分钟initialCacheConfiguration.put("userCache1", getDefaultSimpleConfiguration().entryTtl(Duration.ofMinutes(10)));// 设定失效时间为12小时initialCacheConfiguration.put("userCache2", getDefaultSimpleConfiguration().entryTtl(Duration.ofHours(12)));// ...如果有其他的不同cacheName需要控制失效时间,以此类推即可进行添加return RedisCacheManager.builder(redisConnectionFactory)// 设置缓存默认失效时间配置,也就是动态或者未指定的缓存将会使用当前配置.cacheDefaults(defaultCacheConfig)// 不同不同cacheName的个性化配置.withInitialCacheConfigurations(initialCacheConfiguration).build();}/*** 覆盖默认的构造key[默认拼接的时候是两个冒号(::)],否则会多出一个冒号** @return 返回缓存配置信息*/private RedisCacheConfiguration getDefaultSimpleConfiguration() {return RedisCacheConfiguration.defaultCacheConfig().computePrefixWith(cacheName -> cacheName + ":");}}
      
  6. 在控制器Controller的请求方法上添加相应的注解
    1.     @CachePut(value = "userCache", key = "#result.data.id")@PostMappingpublic ResultBean<User> save(HttpServletRequest request, @RequestBody User user) {return ResultBean.success(user);}
    2.     @CacheEvict(value = "userCache", allEntries = true)@PutMappingpublic ResultBean<String> update(HttpServletRequest request, @RequestBody User user) {return ResultBean.success("用户信息修改成功");}
    3.     @Cacheable(value = "userCache3", key = "#id")@GetMapping("/{id}")public ResultBean<User> getById(@PathVariable Long id) {}
    4.     @GetMapping("/page")@Cacheable(value = "userCache", key = "#page+'_'+#pageSize+'_'+#username", unless = "#result.data.total==0")public ResultBean<Page<User>> page(int page, int pageSize, String username) {return ResultBean.success(pageInfo);}
  7. 可以在Redis的可视化操作界面上看出不同的cacheName的缓存的失效时间是不一样的,根据配置的设置,不在缓存管理Map中缓存默认失效时间是1天。可视化界面中的TTL单位是秒

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

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

相关文章

JavaScript的学习之BOM和DOM,就这一篇就OK了!(超详细)

目录 Day28 JavaScript(2) 1、BOM对象 1.1 window对象 1.2 Location ( 地址栏)对象 1.3 本地存储对象 2、DOM对象(JS核心) 2.1 查找标签 2.2 绑定事件 2.3 操作标签 2.4 常用事件 Day28 JavaScript(2) 1、BOM对象 BOM:Broswer object model,即浏览器提供我们开发者…

算法学习 day27

第二十七天 美化数组的最少删除数 2216. 美化数组的最少删除数 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int minDeletion(vector<int>& nums) {int len nums.size();if(len 0) return 0;int res 0,cur 0;for(int i 1;i < len;i)…

企业数字化转型所需的数据在哪里找?企业数据运营有什么用?

现阶段&#xff0c;越来越多企业考虑数字化转型。特别是中小型企业&#xff0c;他们察觉到&#xff1a;数字化转型的关键在于数据的运营。只有通过数据的有效管理和不断挖掘&#xff0c;企业才可以更好地了解市场需求&#xff0c;优化业务流程&#xff0c;提高决策效率&#xf…

[AutoSar]在Davinci developer中mapping Com interface port

目录 关键词平台说明一、实现步骤1.1 新建一个需要接入Com interface 的SWC1.2 Data mapping1.3 选择SWC和信号为分开的还是group1.4 添加前缀后缀1.5 在SWC中使用 关键词 嵌入式、C语言、autosar 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&…

ELK企业级日志分析平台

目录 一、elasticsearch 1、集群部署 2、cerebro部署 3、elasticsearch-head插件部署 4、elasticsearch集群角色分类 二、logstash 1、部署 2、elasticsearch输出插件 3、file输入插件 4、file输出插件 5、syslog 插件 6、多行过滤插件 7、grok过滤 三、kibana数…

微信关键词自动回复有什么用?

微信关键词自动回复有什么用&#xff1f; 关键词回复可以帮助解答客户的高频次问题。 假如&#xff0c;微信可以设置自动回复。。。 你还在担心一个个通过好友手动发欢迎语吗&#xff1f; 遇到常规问题&#xff0c;不用再复制粘贴那个已经回答了一百遍的答案吗&#xff1f;…

新加坡服务器托管-金融企业的选择

新加坡作为一个亚洲金融中心&#xff0c;其优越的地理位置和先进的信息通信技术基础设施&#xff0c;使得其成为了众多金融机构企业选择服务器机房托管的理想地点。金融行业对于服务器的安全性和可靠性要求很高&#xff0c;而将服务器托管在新加坡有许多好处。 首先&#xff0c…

多目标应用:基于多目标粒子群优化算法MOPSO求解微电网多目标优化调度(MATLAB代码)

一、微网系统运行优化模型 微电网优化模型介绍&#xff1a; 微电网多目标优化调度模型简介_IT猿手的博客-CSDN博客 二、多目标粒子群优化算法MOPSO 多目标粒子群优化算法MOPSO简介&#xff1a; 三、多目标粒子群优化算法MOPSO求解微电网多目标优化调度 &#xff08;1&…

BGP笔记实验

IGP(Interior Gateway Protocol)——内部网关协议 OSPF RIP IS-IS IGRP EIGRP EGP(External Gateway Protocol)——外部网关协议 EGP BGP——边界网关协议 AS——自治系统 由单一组织or机构独立维护的网络设备&网络资源的集合 网络范围太大 自治 AS号 为了区分不同…

电脑监控系统是如何支持远程监控的?

电脑监控系统支持远程监控的方式有多种&#xff0c;以下是其中几种常见的方法&#xff1a; 远程桌面协议 这是一种常见的远程监控协议&#xff0c;它允许用户通过互联网远程访问和控制被监控的电脑。RDP是一种加密的协议&#xff0c;可以保证数据传输的安全性和隐私性。使用RD…

4. Pandas行列操作

4.1 新增列 4.1.1 assign Pandas中的assign&#xff08;&#xff09;函数不仅可以实现不改变原数据情况下新增列&#xff0c;而且可以同时新增多列&#xff0c;还可以配合链式操作使用一行代码完成多个新增列创建&#xff0c;使得代码非常整洁。 &#xff08;1&#xff09;函…

初识树(c语言)

树 定义&#xff1a;树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 有一个特殊的结点&#xff0c;称为根结点&#xff0c;根节点没有前驱结点 除根节点外&#xff0c;其余结点被分成M(M>0)个互不相交…

如何在公网环境下使用笔记本的Potplayer访问本地群晖webdav中的影视资源

文章目录 如何在公网环境下使用笔记本的Potplayer访问本地群晖webdav中的影视资源**那么问题来了&#xff0c;potplayer只能局域网内访问资源&#xff0c;那我不在家中怎么看本地电影&#xff1f;** 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果…

git撤销某一次commit提交

一&#xff1a;撤销上一次commit提交&#xff0c;但不删除修改的代码 可以使用使用VSCode 二&#xff1a;使用 git reset --hard命令删除提交时&#xff0c;将会删除该提交及其之后的所有更改&#xff08;相当于你想要回滚到的提交的提交ID&#xff09; git reset --hard 版本…

从Hugging Face上手动下载并加载预训练模型

0. 说明&#xff1a; 从 Hugging Face 上下手动载预训练的蛋白质语言模型&#xff08;以ProstT5为例&#xff09;&#xff0c;用模型中的 encoder 部分对蛋白质进行编码&#xff0c;得到 embedding features&#xff0c;用于下游的任务。 【ps. 除了手动下载之外&#xff0c;…

我在CSDN开组会1-蒙特卡洛模拟在矿床学的应用展望

各位老师、同学们&#xff0c;大家好。今天组会的内容是蒙特卡洛模拟在矿床学的应用展望。 为什么要讲蒙特卡洛模拟呢&#xff0c;因为我发现在地质学方面已经有不少应用&#xff0c;但是蒙特卡洛模拟延伸的知识太晦涩了&#xff0c;劝退了很多探究者们。因此&#xff0c;计划…

基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度matlab程序

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 参考文献&#xff1a; 基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度——陈登勇 主要内容&#xff1a; 以碳交易和碳封存成本、燃煤机组启停和煤耗成本、弃风成本、购气成本之和为目标函数&…

软件设计中如何画各类图之一实体关系图(ER图):数据库设计与分析的核心工具

目录 1 前言2 符号及作用&#xff1a;3 绘制清晰的ER图步骤4 实体关系图的用途5 使用场景6 实际应用场景举例7 结语 1 前言 当谈到数据库设计与分析的核心工具时&#xff0c;实体关系图&#xff08;ER图&#xff09;无疑是其中最重要的一环。在软件开发、信息管理以及数据库设…

听GPT 讲Rust源代码--src/librustdoc

题图来自 Why is building a UI in Rust so hard? File: rust/src/librustdoc/core.rs 在Rust中&#xff0c;rust/src/librustdoc/core.rs文件的作用是实现了Rustdoc库的核心功能和数据结构。Rustdoc是一个用于生成Rust文档的工具&#xff0c;它分析Rust源代码&#xff0c;并生…

【每日一题】设计循环队列(C语言)

循环队列是我们可以对队列有更深一步的理解的题目&#xff0c;而且可以进一步加强其他方面的知识&#xff08;例如对循环数组的取模运算&#xff0c;指针的解引用&#xff09;&#xff0c;是个蛮不错的巩固习题&#xff0c;话不多说&#xff0c;进入正题。 链接在此&#xff1…