Spring cache整合Redis使用介绍

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、 Spring cache简介
  • 二、 常用注解
  • 三、 使用步骤
    • 3.1 引入依赖
    • 3.2 开启缓存支持
    • 3.3 引入Redis配置
    • 3.4 添加注解
    • 3.5 启动测试,发现报如下错误
    • 3.6 Redis客户端存储的是二进制数据如何解决
  • 四、 注解中key和value的介绍及使用(重点)
    • 4.1 每个注解的SPEL表达式支持有所区别
    • 4.2 使用时还需注意
  • 五、 设置Spring cache的缓存失效时间
    • 5.1 第一种
    • 5.2 第二种

是

一、 Spring cache简介

官方文档中有详细介绍:https://docs.spring.io/spring-framework/reference/integration/cache/annotations.html
Spring cache是Spring提供的通用缓存框架,利用AOP,实现了基于注解的缓存功能。
Spring cache只是提供了一层抽象,地城可以切换不同的cache实现,具体就是通过CacheManager接口开统一不同的缓存技术,CacheManagerSpring提供的各种缓存技术抽象接口。

二、 常用注解

注解描述
@EnableCaching开启缓存注解功能
@Cacheable 从缓存查询,存在则返回,不存在查询数据库,存入缓存
@CachePut将数据结果存入缓存
@CacheEvict清空缓存内容属性(allEntries = true) 表示清空所有
@Caching多缓存配置

缓存非null值
因为在使用中,可能会查询到null所以进行处理
在@Cacheable注解中,提供了两个属性,分别是 :condition ,unless

  • condition:表示满足条件,再缓存
  • unless: 表示满足条件,不缓存
  @Cacheable(value = "cache",key = "#id",unless = "#result == null")@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {return providerService.queryById(id);}

注意: 这里只能使用unless,因为在condition中无法获取到结果#result

三、 使用步骤

  • 在Spring Boot项目中,使用缓存技术只需在项目导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持。
  • 由于Spring cache的基本功能是spring核心(spring-context)中提供,无需引入其他依赖。
  • 默认情况下,Spring cache使用ConcurrentHashMap作为本地缓存存储数据,如何要使用其他的缓存框架,我们只需要做简单的配置即可。
  • 例如:使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可

3.1 引入依赖

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

3.2 开启缓存支持

@EnableCaching
@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}

3.3 引入Redis配置

默认情况下,Spring cache使用ConcurrentHashMap作为本地缓存存储数据,如何要使用其他的缓存框架,我们只需要做简单的配置即可。

 <!-- redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
spring:redis:host: 196.120.168.100port: 6379database: 1password:

3.4 添加注解

下面方法只是根据id查询数据库,因此简单的代码就不展示了,我们主要关注注解的使用就可以了。

    /*** 根据id查询用户信息*/@Cacheable("user")@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {return providerService.queryById(id);}

3.5 启动测试,发现报如下错误

在这里插入图片描述
只需加入该配置即可:

spring:cache:type: redis

接口返回正常,redis客户端查看正常
在这里插入图片描述在这里插入图片描述

3.6 Redis客户端存储的是二进制数据如何解决

但是发现redis存储的格式是二进制形式(默认序列化使用的是 JdkSerializationRedisSerializer ,存储二进制字节码)。不够直观,这时我们可以自定义RedisTemplate模板

@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);// 用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();redisTemplate.setKeySerializer(stringRedisSerializer); // keyJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);ObjectMapper objectMapper = new ObjectMapper();// 指定要序列化的域(field,get,set),访问修饰符(public,private,protected)objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(objectMapper);redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); //valueredisTemplate.setHashKeySerializer(stringRedisSerializer);redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}
}
  • 再次调用查看,还是二进制,这时发现RedisTemplate调用是正常的,而只有使用@Cacheable("user")时是二进制
  • 这是因为使用@Cacheable注解的时候会将返回的对象缓存起来,默认缓存的值是二进制的,这时添加如下配置,定义redisCacheManagerredisTemplate配置进行绑定
  @Beanpublic RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisTemplate.getConnectionFactory());RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
//                .entryTtl(Duration.ofHours(1))// 设置缓存有效期一小时.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));return new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);}

成功查看
在这里插入图片描述

四、 注解中key和value的介绍及使用(重点)

  • value:缓存的名称,每个缓存名称下面可以有多个key
  • key : 缓存的key, 支持SPEL表达式
    /*** 根据id查询用户信息*/@CachePut(value = "user",key = "#result.id")@GetMapping("/{id}")public User queryById(@PathVariable("id") Long id) {return providerService.queryById(id);}

4.1 每个注解的SPEL表达式支持有所区别

官方文档中有详细介绍:https://docs.spring.io/spring-framework/reference/integration/cache/annotations.html
在这里插入图片描述这里列出一些,供参考
在这里插入图片描述在这里插入图片描述

常用格式@CachePut(value = "cache",key = "#user.id")@CachePut(value = "cache",key = "#p0.id")@CachePut(value = "cache",key = "#root.args[0].id")@CachePut(value = "cache",key = "#id")@CachePut(value = "cache",key = "'test'+ #id")静态方法调用@Cacheable(value = "user",key = "T(com.use.dto.bean.CurrentRequest).getUser().getUid()")

4.2 使用时还需注意

例如:

  • @CachePut可以使用#result
  • @Cacheable中则不可以使用,具体这里不一一测试,使用时还需注意

在这里插入图片描述
在这里插入图片描述

五、 设置Spring cache的缓存失效时间

在真实开发中失效时间是必须设置的,不然一直占用内存是不可取的

5.1 第一种

全局生效

spring:redis:time-to-live: 1800000  # 缓存过期时间 单位毫秒

5.2 第二种

局部设置

@Configuration
public class RedisCacheConfig {//设置失效时间private static final Map<String, Duration> cacheMap;static {cacheMap = ImmutableMap.<String, Duration>builder().put("user", Duration.ofMinutes(5)).build();}//配置RedisCacheManagerBuilderCustomizer对象@Beanpublic RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {return (builder) -> {//根据不同的cachename设置不同的失效时间for (Map.Entry<String, Duration> entry : cacheMap.entrySet()) {builder.withCacheConfiguration(entry.getKey(),RedisCacheConfiguration.defaultCacheConfig().entryTtl(entry.getValue()));}};}
}

在这里插入图片描述在这里插入图片描述

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

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

相关文章

【网络教程】如何创建/添加钉钉机器人以及如何获取机器人的Token/Secret

文章目录 创建钉钉机器人添加钉钉机器人获取机器人的Token/Secret相关网站创建钉钉机器人 这里以PC端的操作为例,按照如下操作进行 访问 钉钉开放平台选择机器人选项卡,点击右上角的创建应用,这里会有一个弹窗,我这里选择的是继续使用旧版,如图按照要求填写相关信息创建自…

第六次作业 运维高级 docker容器

1.安装docker服务&#xff0c;配置镜像加速器 卸载旧版本 yum remove docker docker-common docker-selinux docker-engine使用yum源安装 &#xff08;1&#xff09;安装Docker所需要的一些工具包 yum install -y yum-utils&#xff08;2&#xff09; 建立Docker仓库 (映射…

Java——它要求用户输入一个整数(实际上是一个字符串),然后计算该整数的平方值,并将结果输出。

这是一个Java程序&#xff0c;它要求用户输入一个整数&#xff08;实际上是一个字符串&#xff09;&#xff0c;然后计算该整数的平方值&#xff0c;并将结果输出。程序的基本流程如下&#xff1a; 首先&#xff0c;声明并初始化变量data和result&#xff0c;它们的初始值都为…

扁线电机定子转子工艺及自动化装备

售&#xff1a;扁线电机 电驱对标样件 需要请联&#xff1a;shbinzer &#xff08;拆车邦&#xff09; 新能源车电机路线大趋势&#xff0c;自动化装配产线需求迫切永磁同步电机是新能源车驱动电机的主要技术路线。目前新能源车上最广泛应用的类型为永磁同步电机&#xff0c…

W5500-EVB-PICO进行UDP组播数据回环测试(九)

前言 上一章我们用我们的开发板作为UDP客户端连接服务器进行数据回环测试&#xff0c;那么本章我们进行UDP组播数据回环测试。 什么是UDP组播&#xff1f; 组播是主机间一对多的通讯模式&#xff0c; 组播是一种允许一个或多个组播源发送同一报文到多个接收者的技术。组播源将…

如何搭建智能问答FAQ的底层数据基础呢?

搭建智能问答FAQ的底层数据基础是构建一个高效和准确的问答系统的关键。在这篇文章中&#xff0c;我们将探讨如何搭建智能问答FAQ的底层数据基础&#xff0c;并介绍需要注意的几个方面。 一、了解智能问答FAQ的概念和优势 智能问答FAQ是一种基于人工智能技术的问答系统&#…

Android进阶之路 - EditText输入字体自适应

遇到这么一个需求&#xff1a;“控件宽度有限&#xff0c;随着输入内容&#xff0c;动态修改字体大小”&#xff0c;如果是你&#xff0c;只如何来实现&#xff1f;又有几种方式&#xff1f; 嗯&#xff0c;就是这么一个简单的需求&#xff0c;让我记录了俩篇blog Android进阶…

ChatGPT提示与技巧分享:如何作出更好的提示2023年8月

​对ChatGPT的一些酷炫技巧感兴趣吗?这里提供了一些可以帮助你充分利用ChatGPT&#xff0c;成为AI工具专家的技巧。 毫无疑问&#xff0c;ChatGPT是目前最广泛使用的人工智能工具之一。它不仅毫不留情地取代了一些特定领域常用的软件小工具&#xff08;如智能对联、经典语录生…

ESP32应用教程(1)— VL53L3CX距离传感器

文章目录 前言 1 产品概述 1.1 技术规格 1.2 系统框图 1.3 设备引脚分布 2 工作流程 2.1 系统功能描述 2.2 状态机描述 2.3 测距模式说明 3 控制接口 3.1 设备地址 3.2 IC写1个字节数据 3.3 IC读1个字节数据 3.4 IC写多个字节数据 3.5 IC读多个字节数据 3.6 IC…

Nacos配置管理、Feign远程调用、Gateway服务网关

1.Nacos配置管理 1.1.将配置交给Nacos管理的步骤 1.在Nacos中添加配置 Data Id服务名称-环境名称.yaml eg&#xff1a;userservice-dev.yaml 2.引入nacos-config依赖 在user-service服务中&#xff0c;引入nacos-config的客户端依赖 <!--nacos配置管理依赖--> <dep…

Flink、Yarn架构,以Flink on Yarn部署原理详解

Flink、Yarn架构&#xff0c;以Flink on Yarn部署原理详解 Flink 架构概览 Apache Flink是一个开源的分布式流处理框架&#xff0c;它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础&#xff0c;架构原理可以分为以下四个部分&#xff1a;JobManager、TaskM…

Linux:LAMP架构与论坛搭建

目录 一、动态资源与语言 二、LAMP 架构的组成 三、CGI和astcgi 3.1CGI​​​​​​ 3.2fastcgi 3.3CGI和fastcgi比较 3.4 PHP 配置 3.5 Opcode语言 四、编译安装Apache http 服务 五、安装论坛 一、动态资源与语言 WEB 资源类型&#xff1a; 静态资源&#xff1a;原…

Qt串口通信学习文档

这是官方文档&#xff0c;我也在学习。 QSerialPort Class | Qt Serial Port 5.15.14https://doc.qt.io/qt-5/qserialport.html

如何将下载的安装包导入PyCharm

1. 下载安装包 这里以pyke为例。下载好之后解压缩&#xff0c;然后放入/Lib/site-packages/pyke-1.1.1 2. 打开PyCharm的终端进行安装 python setup.py install 3. 安装好之后导入即可使用 import pyke

用户端Web自动化测试_L3

目录&#xff1a; 浏览器复用Cookie 复用pageobject设计模式异常自动截图测试用例流程设计电子商务产品实战 1.浏览器复用 复用浏览器简介 为什么要学习复用浏览器&#xff1f; 自动化测试过程中&#xff0c;存在人为介入场景提高调试UI自动化测试脚本效率 复用已有浏览…

牛客网Verilog刷题 | 入门特别版本

文章目录 1、 VL1 输出12、VL2 wire连线3、 VL3 多wire连接4、VL4 反相器5、VL5 与门6、VL6 NOR 门7、VL7 XOR 门8、VL8 逻辑运算10、VL10 逻辑运算211、VL11 多位信号12、VL12 信号顺序调整13、VL13 位运算与逻辑运算14、VL14 对信号按位操作15、VL15 信号级联合并16、VL16 信…

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息&#xff0c;B/S有的东西&#xff0c;C/S当然也可以有&#xff0c;就像QQ的消息提示一样&#xff01; 实现一个类似的东西并不困难&#xff0c;只要想明白原理实现起来就很简单了&#xff01; 实现原理&#xff1a; &#xff08;1&#…

在百度地图中添加自定义全屏控件

百度地图中添加全屏控件 前置知识&#xff1a; 进入整个页面的全屏模式 &#xff1a;document.documentElement.requestFullscreen() 进入特定元素的全屏模式 &#xff1a; document.getElementById("ID").requestFullscreen() 退出全屏&#xff1a;document.exitFu…

免费PPT素材网站,我推荐这6个

找PPT素材、模板&#xff0c;就上这6个网站&#xff0c;免费下载&#xff0c;建议收藏~ 菜鸟图库 https://www.sucai999.com/search/ppt/0_0_0_1.html?vNTYwNDUx 菜鸟图库网有非常丰富的免费素材&#xff0c;像设计类、办公类、自媒体类等素材都很丰富。PPT模板种类很多&…

leetcode76. 最小覆盖子串(滑动窗口-java)

滑动窗口 最小覆盖子串滑动窗口代码 上期经典 最小覆盖子串 难度 - 困难 原题链接 - 最小覆盖字串 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 “” 。 注意&#xff1a; 对于 t…