SpringCache -- Redis --- 配置与缓存使用--配置过期时间

写在前面:
学redis,还是得搭配SpringCache来玩一玩。
前置内容
  • win安装+redis基础
  • springboot使用redis

文章目录

  • 导入依赖
    • 配置cache
  • 使用
    • @Cacheable
    • @CachePut
    • @CacheEvict
  • 配置过期时间
    • 依据cacheName设置
    • 在注解上截取过期时间

导入依赖

        <!--redis依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><!--redis连接池 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency><!--SpringCache缓存 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>

配置cache

在yml下

spring:cache:type: redisredis:key-prefix: Client_ #key前缀,如果配置了cacheManager则失效use-key-prefix: true #是否开启key前缀cache-null-values: true #是否缓存空值

在配置类上加上@EnableCaching开启缓存
配置序列化器
RedisConfig implements CachingConfigurer
redis的序列化器配置见前文,

    /*** 对缓存进行序列化和反序列化的配置* @param factory redis连接工厂* @return*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory){RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1)) // 配置缓存时长// 注意0为永久用于 Duration.ZERO 声明永久缓存。.prefixCacheNameWith("Client:") // 前缀.computePrefixWith(cacheName -> "caching:" + cacheName); //前缀动态.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) // key序列化方式.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json())); // value序列化方式return RedisCacheManager.builder(factory).cacheDefaults(config).build();}

使用

在这里配置就差不多了,在需要进行缓存操作的地方加注解就可以了

@Cacheable

该注解为缓存获取注解:

如果缓存中没有则进行查询在添加到缓存,如果缓存有则直接走缓存

属性

  • value/cacheName
    他们互为别名
    确定目标高速缓存(或高速缓存),与特定 Bean 定义的限定符值或 Bean 名匹配
    最终缓存的key为prefix+cacheName:: key
  • key
    指定缓存的key,可以使用Spring Expression Language (SpEL) 表达式来进行动态设置。

SpEL 表达式:

  1. 可以使用 #root.method, #root.target, and #root.caches 来指定 方法, 目标对象和受影响的缓存的method引用
    @cacheable(value =“phone”,key="#root.methodName”)
    指定方法名来作为
  2. 可以使用#形参名字来使用,下面是用phone的id来
    @Cacheable(value = “Phone”,key=“#phone.id”)
    public Result<List> getAll(Phone phone)
  3. 方法参数可以通过索引访问。例如,可以通过 或 #p1 #a1访问#root.args[1]第二个参数。如果该信息可用,也可以按名称访问参数。
  • cacheManager
    指定管理器
  • condition
    缓存的条件,可以为空,使用SPEL表达式编写,返回true或者false,true表示存入缓存
  • KeyGenerator
    指定key生成对策
    如果是自定义对象类型,判断不了可以自定义KeyGenerator
@Component
public class MyGenerator implements KeyGenerator{@overridepublic Object generate(object o, Method method, object... objects){}
}
  • unless
    用于否决缓存放置操作的 Spring 表达式语言 (SpEL) 表达式。如果条件的计算结果为 true。
    默认值为 “”,表示缓存永远不会被否决。
  • cacheResolver
    要使用的自定义 org.springframework.cache.interceptor.CacheResolver 的 Bean 名称。

@CachePut

更新缓存
每次都会调用方法,把返回值缓存起来,每次都会更新/新增
注解和前面一样

@CacheEvict

删除缓存
调用后删除指定缓存
注解相同,多了几个

  • allEntries
    是否删除缓存中的所有条目。
  • beforeInvocation
    是否应在调用该方法之前进行逐出。
    将此属性设置为 true,会导致逐出发生,而不考虑方法结果(即,是否引发异常)。

配置过期时间

我是2种方法都配置了的

依据cacheName设置

主要在与对于每一个cacheName设置不同的RedisCacheConfiguration
多个cacheName就加多个withCacheConfiguration就可以了

    /*** 对缓存进行序列化和反序列化的配置** @param factory redis连接工厂* @return*/@Beanpublic CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) {RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofDays(1)) // 配置缓存时长.prefixCacheNameWith("Client:") // 前缀.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string())) // key序列化方式.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json())); // value序列化方式// 如果不需要第二种就把CustomRedisCacheManager换成RedisCacheManagerreturn CustomRedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(factory).cacheDefaults(config).withCacheConfiguration("contact:relation", getCacheConfigurationWithTtl(redisTemplate, Duration.ofMinutes(30))).transactionAware().build();}RedisCacheConfiguration getCacheConfigurationWithTtl(RedisTemplate<String, Object> template, Duration time) {return RedisCacheConfiguration.defaultCacheConfig().prefixCacheNameWith("Client:") // 前缀// 设置key为String.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(template.getStringSerializer()))// 设置value 为自动转Json的Object.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(template.getValueSerializer()))// 不缓存null.disableCachingNullValues()// 缓存数据保存1小时.entryTtl(time);}

在注解上截取过期时间

在cacheName上面加上#时间就可以了


/*** 自定义缓存管理器*/
public class CustomRedisCacheManager extends RedisCacheManager {public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {super(cacheWriter, defaultCacheConfiguration);}/*** 针对@Cacheable设置缓存过期时间* @param name* @param cacheConfig* @return*/@Overrideprotected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {String[] array = StringUtils.delimitedListToStringArray(name, "#");// 解析TTLif (array.length > 2) {char c = array[1].charAt(array.length - 1);long ttl = Long.parseLong(StrUtil.sub(array[1], 0, array[1].length() - 1));cacheConfig = switch (c){case 's','S' -> cacheConfig.entryTtl(Duration.ofSeconds(ttl));case 'm','M' -> cacheConfig.entryTtl(Duration.ofMinutes(ttl));case 'h','H' -> cacheConfig.entryTtl(Duration.ofHours(ttl));case 'd','D' -> cacheConfig.entryTtl(Duration.ofDays(ttl));default -> cacheConfig.entryTtl(Duration.ofSeconds(Long.parseLong(array[1])));}cacheConfig = cacheConfig.entryTtl(Duration.ofSeconds(ttl)); // 注意单位我此处用的是秒,而非毫秒}return super.createRedisCache(array[0], cacheConfig);}}

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

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

相关文章

邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导

【问题描述】 邓俊辉的《数据结构&#xff08;C语言版&#xff09;&#xff08;第3版&#xff09;》&#xff08;ISBN&#xff1a;9787302330646&#xff09;中&#xff0c;开始于第48页的“2.6.5 二分查找&#xff08;版本A&#xff09;”内容在第50页详述了“成功查找长度”的…

uniapp 点击事件-防重复点击

uniapp 点击事件-防重复点击 1、common文件并创建anti-shake.js文件 // 防止处理多次点击 function noMoreClicks(methods, info) {// methods是需要点击后需要执行的函数&#xff0c; info是点击需要传的参数let that this;if (that.noClick) {// 第一次点击that.noClick f…

vue循环滚动字幕

在Vue.js中创建一个循环滚动字幕的效果通常需要使用一些CSS和JavaScript来实现。以下是一个简单的示例&#xff0c;展示如何使用Vue.js创建一个循环滚动字幕的效果&#xff1a; 首先&#xff0c;在HTML中创建一个Vue实例&#xff0c;并添加一个包含滚动字幕的容器元素&#xff…

vue消息订阅与发布

1.知识点 是一种组件间通信的方式&#xff0c;适用于任意组件间通信 2.使用步骤 “消息订阅与发布”可依赖的第三方很多&#xff0c;这里使用pubsub-js库 1.安装pubsub&#xff1a;npm i pubsub-js 2.引入&#xff1a;import pubsub from pubsub-js 3.接收数据&#xff1a;A组件…

【数据结构】排序合集(万字详解)

文章目录 前言插入排序希尔排序选择排序堆排序快速排序hoare原生版本挖坑法前后指针法三数取中优化随机数取key优化三路划分版非递归 归并排序递归非递归调整边界单次归并单次拷贝 总结 前言 排序&#xff0c;以字面意思来说就是通过特定的算法将一组或多组无序或者接近有序的…

02Redis的命令行客户端和桌面客户端的下载和安装

Redis桌面客户端 安装完成Redis服务,我们就可以在Redis的客户端操作Redis的数据库实现数据的CRUD了,客户端分为三类命令行客户端, 图形化桌面客户端,编程客户端 命令行客户端 Redis安装完成后就自带了命令行客户端: redis-cli [options] [commonds] -h选项&#xff1a;指定…

矢量图形编辑软件illustrator 2023 mac软件特点

illustrator 2023 mac是一款矢量图形编辑软件&#xff0c;用于创建和编辑排版、图标、标志、插图和其他类型的矢量图形。 illustrator mac软件特点 矢量图形&#xff1a;illustrator创建的图形是矢量图形&#xff0c;可以无限放大而不失真&#xff0c;这与像素图形编辑软件&am…

计算机网络 实验二 交换机的基本配置

实验二 交换机的基本配置 实验目的 • 掌握交换机的配置方式及切换命令&#xff1b; • 掌握交换机端口的基本配置&#xff1b; • 掌握交换机mac地址的查看与管理方法。 实验设备 以太网交换机一台服务器一台PC机五台配置电缆、网线若干 网络拓扑及IP地址分配 给计算…

题目 1065: 二级C语言-最小绝对值

输入格式 十个数 输出格式 交换后的十个数 样例输入 10 2 30 40 50 60 70 80 90 100 样例输出 10 100 30 40 50 60 70 80 90 2 我对这题用了两个数组&#xff0c;一个存储原来的值&#xff0c;一个是镜像的绝对值。 找最小的数和序号就在镜像里&#xff0c;遍历寻找就行 #i…

Docker部署ActiveMQ消息中间件

1、准备工作 docker pull webcenter/activemq:5.14.3 Pwd"/data/software/activemq" mkdir ${Pwd}/data -p2、运行容器 docker run -d --name activemq \-p 61616:61616 \-p 8161:8161 \-v ${Pwd}/data:/opt/activemq/data \-v /etc/localtime:/etc/localtime \--r…

服务器补丁管理软件

随着漏洞的不断上升&#xff0c;服务器修补是增强企业网络安全的典型特征。作为业务关键型机器&#xff0c;计划服务器维护的停机时间无疑是一件麻烦事。但是&#xff0c;借助高效的服务器补丁管理软件&#xff08;如 Patch Manager Plus&#xff09;&#xff0c;管理员可以利用…

UE5读取json文件

一、下载插件 在工程中启用 二、定义读取外部json文件的函数&#xff0c;参考我之前的文章 ue5读取外部文件_艺菲的博客-CSDN博客 三、读取文件并解析为json对象 这里Load Text就是自己定义的函数&#xff0c;ResourceBundle为一个字符串常量&#xff0c;通常是读取的文件夹…

UML活动图

在UML中&#xff0c;活动图本质上就是流程图&#xff0c;它描述系统的活动、判定点和分支等&#xff0c;因此它对开发人员来说是一种重要工具。 活动图 活动是某件事情正在进行的状态&#xff0c;既可以是现实生活中正在进行的某一项工作&#xff0c;也可以是软件系统中某个类…

[Linux] 1.Linux的简介

Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。 Linux发行版&#xff1a;基于Linux内核定制不同风格的Linux ubuntu:嵌入式开发 …

题目 1069: 二级C语言-寻找矩阵最值

输入一个正整数n (1≤ n ≤6),再输入一个n 行n列的矩阵&#xff0c;找出该矩阵中绝对值最大的元素以及它的行下标和列下标。 输入格式 n nxn &#xff08;矩阵的数据&#xff09; 输出格式 数 行 列 样例输入 2 1 2 3 4样例输出 4 2 2 二维矩阵的创建cpp代码实现&a…

Linux实验一

#include <stdio.h> #include <stdlib.h> int main() { printf("hello ,\n"); printf("world\n"); // 使用 exit(0) 结束进程 exit(0); } #include <stdio.h> #include <unistd.h> int main() { printf("hello ,\n")…

Ubuntu上通过源码方式安装Redis

上一篇文章Ubuntu上安装、使用Redis的详细教程已经介绍了再Ubuntu操作系统上安装Redis的详细过程&#xff0c;但是因为安装的Redis只有最主要的配置文件和redis-server&#xff0c;为了更深入地学习Redis和进行更复杂的操作&#xff0c;需要安装一个完整的Redis服务。 这篇文章…

day-53 代码随想录算法训练营(19)动态规划 part 14

1143.最长公共子序列&#xff08;坐牢&#xff09; class Solution { public:int longestCommonSubsequence(string text1, string text2) {int ntext1.size(),mtext2.size();vector<vector<int>>dp(n1,vector<int>(m1,0));for(int i1;i<n;i){for(int j1…

SEO方案尝试--Nuxtjs项目基础配置

Nuxtjs 最新版 Nuxt3 项目配置 安装nuxtjs 最新版 Nuxt3 参考官网安装安装插件安装ElementPlus页面怎么跳转&#xff0c;路由怎么实现404页面该怎么配置配置 网页的title 安装nuxtjs 最新版 Nuxt3 参考官网安装 安装插件 安装ElementPlus 安装 Element Plus 和图标库 # 首先&…

Opencv源码解析(2)算法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 目录 一&#xff0c;直方图均衡 1&#xff0c;直方图统计 2&#xff0c;灰度变换 3&#xff0c;直方图均衡 二&#xff0c;可分离…