SpringBoot Cache 整合 Redis 缓存框架

文章目录

    • 引入依赖
    • 配置 Redis
    • 启动类注解
    • 注解开发
      • @Cacheable
      • @CachePut
      • @CacheEvict
    • 注解属性
      • cacheNames/value
      • key
      • keyGenerator
      • condition
      • unless
      • cacheManager
      • sync
    • SpEL 表达式

SpringBoot 提供了 SpringBootCache 框架作为 SpringBoot 的缓存统一框架,使用 SpringBootCache ,我们可以使用注解的方式使用缓存,从而避免了写一些重复代码的问题。

引入依赖

首先我们需要引入相关的依赖,Cache 是缓存框架的核心依赖,不过该框架只提供了各种操作的接口集合,并没有具体的实现。

而接口之外,SpringBoot 提供了各种具体的实现,比如:RedisCache,EhCache,ConcurrentMapCache等等。

Redis 依赖是为了使用 Redis 作为缓存而引入的,如果不使用 Redis 作为缓存,也可以将 Redis 的依赖替换为其他实现。

Jackson 是作为序列化工具。

  • Maven
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><version>2.7.3</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.7.3</version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><version>2.7.3</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.13.3</version>
</dependency>
  • Gradle
dependencies {implementation 'org.springframework.boot:spring-boot-starter-cache:2.7.3'implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.7.3'implementation 'org.springframework.boot:spring-boot-starter-test:2.7.3'implementation 'com.fasterxml.jackson.core:jackson-databind:2.13.3'
}

配置 Redis

因为我们引入了 SpringBootRedis 的依赖,Spring 会默认使用 Redis 作为我们的缓存,所以需要配置 Redis 的信息。

  • application.yaml
spring:redis:host: 127.0.0.1port: 6379
  • RedisCacheManager
@Configuration
public class RedisCacheConfig {@Beanpublic RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {// 使用缓存的默认配置RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();// 使用 GenericJackson2JsonRedisSerializer 作为序列化器config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));RedisCacheManager.RedisCacheManagerBuilder builder =RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config);return builder.build();}
}

启动类注解

使用 SpringBootCache 作为缓存框架,我们需要在 SpringBoot 的启动类上添加 @EnableCaching 注解,这样才能够启用缓存框架。

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

注解开发

我们只需要在方法上面添加相关的注解,即可使用缓存逻辑,从而提升服务性能。

@Cacheable

该注解可以注解在方法和类上,当被注解的类下的方法或者被注解的方法被调用时,会先去缓存中查看是否有缓存数据,有缓存数据则直接返回缓存数据,无缓存数据则调用该方法,获取该方法的返回值,并将该返回值存入缓存中。

@CachePut

该注解可以注解在方法和类上,当被注解的类下的方法或者被注解的方法被调用时,不管缓存中是否有对应的缓存数据,都会将该方法的返回值更新(插入或覆盖)到缓存中。

@CacheEvict

该注解可以注解在方法和类上,当被注解的类下的方法或者被注解的方法被调用时,会直接删除缓存中的缓存数据。

注解属性

@Cacheable,@CachePut,@CacheEvict三个注解都有一些属性。

cacheNames/value

用来指定缓存组件的名字。

@Cacheable(cacheNames = "user")
public User selectById(Integer id) {return new User(id);
}

key

缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你必须使用 spEL 表达式来编写)

@Cacheable(cacheNames = "user", key = "#id")
public User selectById(Integer id) {return new User(id);
}

使用以上的配置,如果入参的 id 值为 1Redis 会存入一个 key 为 user::1 数据。

@Cacheable(cacheNames = "user", key = "#root.methodName")
public User selectById(Integer id) {return new User(id);
}

使用以上的配置,如果入参的 id 值为 1Redis 会存入一个 key 为 user::selectById 数据。

keyGenerator

key 的生成器。 key 和 keyGenerator 二选一使用。

@Bean
public KeyGenerator keyGenerator() {return (target, method, params) -> Arrays.asList(params).toString();
}

使用以上的配置,如果入参的 id 值为 1Redis 会存入一个 key 为 user::[1] 数据。

condition

可以用来指定符合条件的情况下才缓存。

@Cacheable(cacheNames = "user", key = "#id", condition = "#id > 1")
public User selectById(Integer id) {return new User(id);
}

unless

否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)

该属性相当于 !condition 属性。

@Cacheable(cacheNames = "user", key = "#id", unless = "#id > 1")
public User selectById(Integer id) {return new User(id);
}

cacheManager

可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。

sync

是否使用异步模式。

SpEL 表达式

名字位置描述示例
methodNameroot object当前被调用的方法名#root.methodName
methodroot object当前被调用的方法#root.method.name
targetroot object当前被调用的目标对象#root.target
targetClassroot object当前被调用的目标对象类#root.targetClass
argsroot object当前被调用的方法的参数列表#root.args[0]
cachesroot object当前方法调用使用的缓存列表(如 @Cacheable(value=[“cache1”,"cache2J),则有两个 cache)#root.caches[0].name
argument nameevaluation context方法参数的名字,可以直接使用 #参数名,也可以使用 #p0 或 #a0 的形式,0代表参数的索引。#a0
resultevaluation context方法执行后的返回值 (仅当方法执行后的判断有效)#result

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

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

相关文章

php连接上mysql数据库该的配置方法

用mysql官方的管理工具workbench&#xff1a; 打开导出界面后&#xff0c;下一步&#xff0c;选择csv格式&#xff0c;导出后excel就能打开了 如果你需要在程序代码中导出&#xff0c;需要找到对应代码的excel处理库。 如php 的 phpExcel( 最新版已更名为 phpoffice/phpspread…

selenium WebDriver 中的几种等待--sleep(),implicitly_wait(),WebDriverWait()

目录 强制等待:sleep() 隐式等待:implicitly_wait() 显示等待:WebDriverWait() 与until()或者until_not()方法结合使用 WebDriverWait与expected_conditions结合使用 显示等待,自定义等待条件 强制等待:sleep() import time sleep(5) #等待5秒 设置固定休眠时间&#x…

14matlab数理统计 多项式的求根和根据根求多项式(matlab程序)

1.简述 分享一下通过多种不同的方法计算多项式的根。 数值根 使用代换法求根 特定区间内的根 符号根 数值根 roots 函数用于计算系数向量表示的单变量多项式的根。 例如&#xff0c;创建一个向量以表示多项式 x2−x−6&#xff0c;然后计算多项式的根。 p [1 -1 -6]; r …

Prometheus节点监控及hadoop集群监控

背景:我司长期苦于CM6.3后收费问题,这次领导痛下决心,决定要自己开发一套大数据管理平台,监控就是其中一部分,本文主要阐述,话不多说,先看效果。 1.监控组件Prometheus 1.1上传Prometheus包 [root@bigdb01 ~]# rsync root@172.16.1.247/data/fan/install/native/09.…

uni.app如何检测小程序版本更新以及上线后如何关闭全局打印

uni.app如何检测小程序版本更新以及上线后如何关闭全局打印 检测小程序版本更新关闭全局打印 检测小程序版本更新 App.vue 入口文件中 添加如下代码 //检测小程序版本是否更新const updateManager wx.getUpdateManager()updateManager.onCheckForUpdate(function(res) {// 请求…

DuiLib中的list控件以及ListContainerElement控件

文章目录 前言1、创建list控件2、创建 ListContainerElement 元素&#xff0c;并添加到 List 控件中,这里的ListContainerElement用xml来表示3、在 ListContainerElement 元素中添加子控件 1、List控件2、ListContainerElement控件 前言 在 Duilib 中&#xff0c;List 控件用于…

【批量将视频转为图像序列】

批量将视频转为图像序列 代码如下&#xff0c;代码中带有解释&#xff1a; # 导入所需要的库 import cv2 import os import numpy as np# 多个视频所在的路径 datasets_path ["/home/y/Code/数据集/1/007f.mp4","/home/y/Code/数据集/1/05f.mp4","/…

UI界面中的图标设计趋势与最佳实践

作为UI设计师&#xff0c;在日常的工作中&#xff0c;避免不了做图标规范。今天跟大家聊一聊&#xff0c;UI设计中的图标设计。 规范的重要性不用多说了&#xff0c;没有规范多个设计师绘制的图标会有很多差异&#xff0c;描边粗细、角度、圆角度等等。今天的文章和大家聊一下…

ChatGPT 的局限性是什么?

ChatGPT 的局限性是什么&#xff1f; 尽管看起来非常令人印象深刻&#xff0c;但 ChatGPT 仍然存在局限性。此类限制包括无法回答以特定方式措辞的问题&#xff0c;因为它需要重新措辞才能理解输入的问题。更大的限制是它提供的响应缺乏质量 - 有时听起来似是而非&#xff0c;…

leetcode303. 区域和检索 - 数组不可变 前缀和

https://leetcode.cn/problems/range-sum-query-immutable/ 给定一个整数数组 nums&#xff0c;处理以下类型的多个查询: 计算索引 left 和 right &#xff08;包含 left 和 right&#xff09;之间的 nums 元素的 和 &#xff0c;其中 left < right 实现 NumArray 类&…

Stable Diffusion - 编辑生成 (OpenPose Editor) 相同人物姿势的图像

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131818943 OpenPose Editor 是 Stable Diffusion 的扩展插件&#xff0c;可以自定义人物的姿势和表情&#xff0c;以及生成深度、法线和边缘图等信…

vue 集成tinymce2实现图片,视频以及文件的上传

vue 集成tinymce2实现图片&#xff0c;视频以及文件的上传 1. 安装插件 &#xff08;1&#xff09;安装tinymce npm install tinymce -S &#xff08;2&#xff09;安装tinymce-vue npm install tinymce/tinymce-vue3.0.1 -S 2. 复制静态文件到public目录 资源下载路径&…

LangChain(5)Conversational Agents

Large Language Models (LLMs) 在语义知识方面表现不错&#xff0c;但也有一些不足&#xff0c;如&#xff1a;不能正确计算数学公式、无法获取最新知识新闻 通过 Agents 可以赋予 LLMs 更多能力&#xff0c;让LLM能够计算、上网查询 agent 简单使用 from langchain import …

Django入门

前言 早就想入门后端了&#xff0c;自己倒是用过Flask&#xff0c;对于常规网站来说Django更完善一些。稍微学习下&#xff0c;能够做一些简单业务处理就好啦。 跟着官方文档学习的&#xff0c;这里做一下记录。纯纯拿来用&#xff0c;不去研究原理与架构&#xff0c;无脑跟着…

MyBatis-Plus的数据安全保护

文章目录 一、介绍二、生成密钥三、加密四、配置文件内容使用密文五、命令行参数 MyBatis-Plus官网https://baomidou.com/ 一、介绍 对配置文件内容加密&#xff0c;3.3.2开始支持使用AES加密算法实现原理&#xff1a;SafetyEncryptProcessor implements EnvironmentPostProc…

17 | 从后端到前端:微服务后,前端如何设计?

微服务架构通常采用前后端分离的设计方式。作为企业级的中台&#xff0c;在完成单体应用拆分和微服务建设后&#xff0c;前端项目团队会同时面对多个中台微服务项目团队&#xff0c;这时候的前端人员就犹如维修电工一样了。 面对如此多的微服务暴露出来的 API 服务&#xff0c…

记一次从溯源分析到云服务器接管

起因是我这个臭运维的在给客户做常态化的溯源分析&#xff0c;好巧不巧发现了一个IP扔到奇安信威胁情报平台看一下&#xff0c;发现部署了大量的服务&#xff0c;且为阿里云服务器。 看到这里&#xff0c;我大胆的推测&#xff0c;云上的信息中心&#xff0c;客户花点钱&#x…

1. Spring 核心与设计思想

目录 1. Spring 是什么&#xff1f; 1.1 什么是容器&#xff1f; 1.2 什么是 Ioc &#xff1f; 1.2.1 传统程序开发 1.2.2 解决传统开发的缺陷 1.2.3 控制反转式程序开发 1.2.4 IoC 的实现思想&#xff08;重点&#xff09; 1.3 理解 Spring Ioc 1.4 DI 概念说明 1. S…

【产品设计】通用后台管理系统需求及原型设计

后台管理系统&#xff0c;会根据不同公司、不同业务的要求做出改变。 网上很多系统的参考多数为业务中台&#xff0c;过于带有业务色彩。做过三四个后台管理系统&#xff0c;从中总结了一个通用的功能和需求设计模版&#xff0c;供大家参考。本文适用于0-2岁的产品经理做基础功…

JVM中类加载的过程

文章目录 一、类加载是什么二、类加载过程1.加载2.验证3.准备4.解析5.初始化 三、什么时候进行类加载四、双亲委派模型1.三大类加载器2.加载过程 总 一、类加载是什么 把.class文件加载到内存中&#xff0c;得到类对象的过程。 二、类加载过程 1.加载 找到.class文件&#xff…