redis缓存注解使用

这里写自定义目录标题

    • 一、引入依赖
    • 二、修改启动类和配置文件
    • 三、添加配置类
    • 四、缓存示例

一、引入依赖

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

二、修改启动类和配置文件

@EnableCaching
public class WebApplication extends SpringBootServletInitializer 
spring:cache:type: redisredis:# Redis数据库索引(默认为0)database: 0# Redis服务器地址host: 127.0.0.1# Redis服务器连接端口port: 6379# Redis服务器连接密码(默认为空)password:# 连接超时时间(毫秒)timeout: 1000

三、添加配置类

package com.ffcs.config;import org.springframework.cache.CacheManager;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.interceptor.SimpleKeyGenerator;
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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;/*** @author 天真热* @create 2022-09-24 13:37* @desc**/
@Configuration
public class RedisConfiguration {// ${cache} 获取配置文件的配置信息   #{}是spring表达式,获取Bean对象的属性
//    @Value("#{${cache}}")
//    private Map<String, Long> ttlParams;/*** @param redisConnectionFactory* @功能描述 redis作为缓存时配置缓存管理器CacheManager,主要配置序列化方式、自定义* <p>* 注意:配置缓存管理器CacheManager有两种方式:* 方式1:通过RedisCacheConfiguration.defaultCacheConfig()获取到默认的RedisCacheConfiguration对象,* 修改RedisCacheConfiguration对象的序列化方式等参数【这里就采用的这种方式】* 方式2:通过继承CachingConfigurerSupport类自定义缓存管理器,覆写各方法,参考:* https://blog.csdn.net/echizao1839/article/details/102660649* <p>* 切记:在缓存配置类中配置以后,yaml配置文件中关于缓存的redis配置就不会生效,如果需要相关配置需要通过@value去读取*/@Beanpublic CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();redisCacheConfiguration = redisCacheConfiguration// 设置key采用String的序列化方式.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(StringRedisSerializer.UTF_8))//设置value序列化方式采用jackson方式序列化.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer()))//全局配置缓存过期时间【可以不配置】//.entryTtl(Duration.ofMinutes(30L))//当value为null时不进行缓存.disableCachingNullValues();//专门指定某些缓存空间的配置,如过期时间【主要这里的key为缓存空间名称】
//        Map<String, RedisCacheConfiguration> map = new HashMap<>();
//        Set<Map.Entry<String, Long>> entries = ttlParams.entrySet();
//        for (Map.Entry<String, Long> entry : entries) {
//            //指定特定缓存空间对应的过期时间
//            map.put("user", redisCacheConfiguration.entryTtl(Duration.ofSeconds(40)));
//            map.put(entry.getKey(), redisCacheConfiguration.entryTtl(Duration.ofSeconds(entry.getValue())));
//        }return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(redisCacheConfiguration)  //默认配置
//                .withInitialCacheConfigurations(map)  //某些缓存空间的特定配置.build();}/*** 自定义缓存的redis的KeyGenerator【key生成策略】* 注意: 该方法只是声明了key的生成策略,需在@Cacheable注解中通过keyGenerator属性指定具体的key生成策略* 可以根据业务情况,配置多个生成策略* 如: @Cacheable(value = "key", keyGenerator = "cacheKeyGenerator")*/@Beanpublic KeyGenerator keyGenerator() {/*** target: 类* method: 方法* params: 方法参数*/return (target, method, params) -> {//获取代理对象的最终目标对象StringBuilder sb = new StringBuilder();sb.append(target.getClass().getSimpleName()).append(":");sb.append(method.getName()).append(":");//调用SimpleKey的key生成器Object key = SimpleKeyGenerator.generateKey(params);return sb.append(key);};}/*** @param redisConnectionFactory:配置不同的客户端,这里注入的redis连接工厂不同: JedisConnectionFactory、LettuceConnectionFactory* @功能描述 :配置Redis序列化,原因如下:* (1) StringRedisTemplate的序列化方式为字符串序列化,* RedisTemplate的序列化方式默为jdk序列化(实现Serializable接口)* (2) RedisTemplate的jdk序列化方式在Redis的客户端中为乱码,不方便查看,* 因此一般修改RedisTemplate的序列化为方式为JSON方式【建议使用GenericJackson2JsonRedisSerializer】*/@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = serializer();RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();// key采用String的序列化方式redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8);// value序列化方式采用jacksonredisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);// hash的key也采用String的序列化方式redisTemplate.setHashKeySerializer(StringRedisSerializer.UTF_8);//hash的value序列化方式采用jacksonredisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);redisTemplate.setConnectionFactory(redisConnectionFactory);return redisTemplate;}/*** 此方法不能用@Ben注解,避免替换Spring容器中的同类型对象*/public GenericJackson2JsonRedisSerializer serializer() {return new GenericJackson2JsonRedisSerializer();}
}

四、缓存示例

  1. 简单测试

    package com.ffcs.test.redis;import com.ffcs.test.mysql.domain.User;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cache.annotation.Cacheable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
    import java.util.Date;/*** @author 天真热* @create 2024-02-19 19:42* @desc**/
    @RestController
    @RequestMapping("/redis")
    public class RedisController {@AutowiredRedisService redisService;@RequestMapping("/test")public String test() {return redisService.getdata();}
    }
    
    package com.ffcs.test.redis;import org.springframework.cache.annotation.Cacheable;
    import org.springframework.stereotype.Service;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
    import java.util.Date;/*** @author 天真热* @create 2024-02-19 19:42* @desc**/
    @Service
    public class RedisService {@Cacheable(value = "space", key = "'key'", sync = true)public String getdata() {SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");return sf.format(new Date());}}
    
  2. 新增缓存:只要在方法上备注了@Cacheable注解,每次调用,都会判断缓存中是否已经存在相应的数据,如果存在,则直接取出。如果不存在,则查询相关数据存入缓存,然后返回。

    @Cacheable(value = "space", key = "key", sync = true), condition = "#id>1000")1)value:指定缓存的名称。可以根据业务来区分,使用自定义的业务名。//不设置则使用默认的缓存
    2)key:指定缓存中的键。即一个缓存中,可以存在不同的键值,一般可以使用业务参数进行区分。//不设置则自动根据参数进行设置键
    3)sync:用于指定是否使用异步模式来执行方法。如果设置为true,则方法的执行将在一个新的线程中进行,不会阻塞当前线程。//不设置默认为false
    4)condition:根据条件判断是否生成缓存。//不设置则无条件过滤
    
  3. 更新缓存:只要在方法上备注了@CachePut注解,每次调用后,都会查询相关数据更新缓存,然后返回。一般修改了缓存值后,及时查数据时调用

    @CachePut(value = "space", key = "'cache'")
    public Map updateCache() {}
    
  4. 删除缓存:只要在方法上备注了@CacheEvict注解,每次调用后,都会删除数据缓存。一般修改了缓存值后,不查数据时调用

  5. 升级用法之使用多个缓存:@Cacheable(value = {“space1”, “space2”})

  6. 升级用法之自定义缓存变量键

    1)根据参数列表获取相关的键变量

    @Cacheable(value = "space", key = "#id")public Map addCacheById(int id) {}#id 为参数列表名称为id的参数值
    
     @Cacheable(value = "space", key = "#m.get('id')")public Map addCacheByMap(Map m) {}#map.get('id') 为参数列表名称为m的map集合,里面的id属性的值
    

    2)根据方法对象获取相关的键变量

    @Cacheable(value = "space", key = "#root.methodName+#root.args[0]+#root.method.name")1. #root表示当前方法对象
    2. #root.methodName表示当前方法名称
    3. #root.args[0]表示当前方法的第一个参数
    
  7. 升级用法之自定义缓存条件:参数用法如升级用法之自定义缓存变量键

  8. 升级用法之自定义缓存条件unless

    @Cacheable(value = "space", key = "#id", unless = "#result==null")
    public Map addCacheByIdAndUnless(int id) {}我们正常的缓存,一般是在进入方法后,执行业务逻辑前,就进行判断是否需要使用缓存。如果需要在执行业务逻辑后在判断是否使用缓存,则可以使用上述的unless属性。
    
  9. 升级用法之自定义模板

    @Cacheable(keyGenerator = "keyGenerator")
    public String addCacheByGenerator(int id) {}我们可以自己自定义模板。然后所有的缓存方法,都可以指定模板进行生成缓存和缓存键。可参考com.ffcs.biyiict.config.RedisConfiguration.keyGenerator
    
  10. 升级用法之删除多个缓存键

    @Caching(evict = {@CacheEvict(value = {"space"}, key = "'1500'"),@CacheEvict(value = {"space"}, key = "'addCacheByMethod15addCacheByMethod'")
    })
    public String delMuchCache() {}
    
  11. 升级用法之删除某个缓存及底下所有键

    @CacheEvict(value = {"space"}, allEntries = true)
    public void delAllCacheOfValue() {}
    
  12. 升级用法之同时新增、修改、删除多个自定义缓存

    @Caching(cacheable = {@Cacheable(value = "t1", key = "#id"), @Cacheable(value = "t2", key = "#id")},put = {@CachePut(value = "t3", key = "#id"), @CachePut(value = "t4", key = "#id")},evict = {@CacheEvict(value = "t5", key = "#id"), @CacheEvict(value = "t6", key = "#id")})
    public String cacheMuchOperator(int id) {}
    

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

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

相关文章

浅谈WPF之Binding数据校验和类型转换

在WPF开发中&#xff0c;Binding实现了数据在Source和Target之间的传递和流通&#xff0c;就像现实生活中的一条条道路&#xff0c;建立起了城镇与城镇之间的衔接&#xff0c;而数据校验和类型转换&#xff0c;就像高速公路之间的收费站和安检站。那在WPF开发中&#xff0c;如何…

在 java 中 arraylist 与 linkedlist 的区别

ArrayList和LinkedList都是Java中的类&#xff0c;它们都实现了List接口&#xff0c;但是它们在实现方式和性能上有一些重要的区别。 底层实现&#xff1a; ArrayList 是基于动态数组的实现&#xff0c;它的元素在内存中是连续存储的。LinkedList 是双向链表的实现&#xff0c;…

Redis核心数据结构之SDS(一)

数据结构与对象 简单动态字符串 概述 Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组&#xff0c;简称C字符串)&#xff0c;而是自己构建了一种名为简单动态字符串(Simple Dynamic String, SDS)的后向类型&#xff0c;并将SDS用作Redis的默认字符串表示。在…

数据库学习案例20240304-mysql数据库案例总结(碎片,统计信息)

1 表中的碎片 在InnoDB中删除行的时候&#xff0c;这些行只是被标记为“已删除”&#xff0c;而不是真正从物理存储上进行了删除&#xff0c;因而存储空间也没有真正被释放回收。InnoDB的Purge线程会异步地来清理这些没用的索引键和行。但是依然没有把这些释放出来的空间还给操…

基于SSM的农业电商服务系统(农产品销售管理系统)(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的农业电商服务系统&#xff08;农产品销售管理系统&#xff09;&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#…

五、软考-系统架构设计师笔记-信息安全技术基础知识

信息安全技术基础知识 1、信息安全基础知识概述 信息安全的概念 信息安全包括 5 个基本要素&#xff1a; 机密性:确保信息不暴露给未授权的实体或进程。完整性:只有得到允许的人才能修改数据&#xff0c;并且能够判别出数据是否已被篡改。可用性:得到授权的实体在需要时可以…

SpringBoot源码解读与原理分析(四十)基于jar/war包的运行机制

文章目录 前言第14章 运行SpringBoot应用14.1 部署打包的两种方式14.1.1 以可独立运行jar包的方式14.1.2 以war包的方式 14.2 基于jar包的独立运行机制14.2.1 可独立运行jar包的相关知识14.2.2 SpringBoot的可独立运行jar包结构14.2.3 JarLauncher的设计及工作原理14.2.3.1 Jar…

06、MongoDB -- MongoDB 基本用法(删除文档、查询文档、查询运算符)

目录 MongoDB 基本用法演示前提&#xff1a;登录单机模式的 mongodb 服务器命令登录【admin】数据库的 mongodb 客户端命令登录【test】数据库的 mongodb 客户端命令 删除文档语法格式两个变体版本&#xff1a;1、remove&#xff1a;根据【name】字段删除一条文档2、deleteOne&…

代码工具APEX的入门使用(未包含安装)

第一次使用APEX是2019年&#xff0c;这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站&#xff0c;这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程&#xff0c;都是用APEX做的。 那一年&#xff0c;我用APEX做了一个CMDB的管理系统。那时候还没有流行…

从0搭建Azure DevOps Server

Windows虚拟机搭建DevOps 服务器 背景资源准备安装软件需求流程版本兼容性安装SQL ServerSSMS安装visual StudioAzure DevOps Server测试本地访问端口更改及外界访问 背景 搭建一台Azure DevOps Server 供我们运维项目开发&#xff0c;现在DevOps运维已成为一个主流&#xff0…

C向C++的一个过渡

思维导图 输入输出&#xff0c;以及基础头文件 在c语言中我们常用scanf("%d",&n);和printf("%d\n",n);来输出一些变量和常量&#xff0c;在C中我们可以用cin;和cout;来表示输入输出。 在C语言中输入输出有头文件&#xff0c;在C也有头文件&#xff0…

软件应用,财务收支系统试用版操作教程,佳易王记录账单的软件系统

软件应用&#xff0c;财务收支系统试用版操作教程&#xff0c;佳易王记录账单的软件系统 一、前言 以下软件操作教程以 佳易王账单记账统计管理系统V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;统计报表包含 收支汇…

在vue前端开发中基于refreshToken和axios拦截器实现token的无感刷新

文章目录 一、需求背景二、token刷新的方案1、根据过期时间重新获取2、定时刷新token接口3、使用了RefreshToken 三、关于RefreshToken四、Refresh Token的优点五、Refresh Token的工作原理六、Refresh Token的使用流程七、Refresh Token的实现步骤1、登录成功后保存AccessToke…

前端CSS常考问题总结

目录 CSS盒模型 CSS选择器的优先级 隐藏元素的方法 px和rem的区别是什么? 重绘重排有什么区别? 重排&#xff08;回流&#xff09;&#xff1a; 重绘&#xff1a; 浏览器的渲染机制: 浏览器如何解析CSS&#xff1f; 元素水平垂直居中的方式 CSS的哪些属性哪些可以…

php开发项目 docx,pptx,excel表格上传阿里云,腾讯云存储后截取第一页生成缩略图

服务器或者存储上传的word,ppt和excel表格需要截取内容展示的时候,就需要管理后台每次上传文件时根据不同文件类型截取图片保存起来,并讲图片的地址保存到数据字段中.网上搜索了很多相关文章遇到的坑不少,经过2天时间终于完成了,将代码和遇到的问题完整记录下来. 本文用的…

【前端寻宝之路】总结学习使用CSS的引入方式

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-BNJBIEvpN0GHNeJ1 {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

IDEA自动导入provided的依赖

最近在学习flink 流程序&#xff0c;在写demo程序的时候依赖flink依赖&#xff0c;依赖的包在flink集群里面是自己已经提供了的&#xff0c;在导入的时候配置为provided&#xff0c;像下面这样&#xff0c;以使打包的时候不用打到最终的程序包里面。 <dependency><gro…

Java8,函数式编程应用:

持续更新中&#xff1a; 函数式(Functional)接口 什么是函数式(Functional)接口 只包含一个抽象方法的接口&#xff0c;称为函数式接口。 你可以通过 Lambda 表达式来创建该接口的对象。&#xff08;若 Lambda 表达式 抛出一个受检异常(即&#xff1a;非运行时异常)&#xff0c…

FastDfs 部署 保姆 级 步骤

注&#xff1a; 1.这是在 b栈后端项目中用到 &#xff0c; github or 课程官方文档 &#xff0c;都难免遇到问题 2.我这里只是将单机部署 跑通了 why fastdfs? FastDFS&#xff08;Fast Distributed File System&#xff09;是一个开源的分布式文件系统&#xff0…

js创建对象方式总结

js创建对象方式总结 字面量方式 使用大括号 {} 创建一个新对象&#xff0c;这是最简单直接的方式。适用于创建单个对象&#xff0c;可以直接在大括号内定义属性和方法。 let person {name: John,age: 30,gender: male};let preson2 {name: John,age: 30,gender: male};cons…