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接口开统一不同的缓存技术,CacheManager
是Spring
提供的各种缓存技术抽象接口。
二、 常用注解
注解 | 描述 |
---|---|
@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注解的时候会将返回的对象缓存起来,
默认缓存的值是二进制的
,这时添加如下配置,定义redisCacheManager
与redisTemplate
配置进行绑定
@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
:缓存的名称,每个缓存名称下面可以有多个keykey
: 缓存的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()));}};}
}
相关文章:
Spring cache整合Redis使用介绍
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
Metasploit提权
一、bypassuac 用户账户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也…...
TypeScript三种特殊类型
1.any类型 说明:any类型代表着可以赋值任意类型 let nickname:any"王二"nickname15nicknametruenicknameundefinednicknamenullnickname{}2.unknown类型 说明:类似any类型;只是不能赋值到其它类型上;除了any和known。…...
如何使用CSS实现一个响应式轮播图?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用CSS实现响应式轮播图的示例⭐ HTML 结构⭐ CSS 样式 (styles.css)⭐ JavaScript 代码 (script.js)⭐ 实现说明⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带…...
数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成
数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成 目录 数据生成 | MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成生成效果基本描述模型描述程序设计参考资料 生成效果 基本描述 1.MATLAB实现MCMC马尔科夫蒙特卡洛模拟的数据生成; 2.马尔科夫链蒙特卡洛方…...
【从零开始的rust web开发之路 二】axum中间件和共享状态使用
系列文章目录 第一章 axum学习使用 第二章 axum中间件使用 文章目录 系列文章目录前言一、中间件是什么二、中间件使用常用中间件使用中间件使用TraceLayer中间件实现请求日志打印自定义中间件 共享状态 前言 上篇文件讲了路由和参数相应相关的。axum还有个关键的地方是中间件…...
Vue操作时间
一、获取现在时间 const currentTime () > {let date new Date();let year date.getFullYear(); //月份从0~11,所以加一let month date.getMonth();let dateArr [date.getMonth() 1,date.getDate(),date.getHours(),date.getMinutes(),date.getSeconds(),…...
数据库——Redis 常见数据结构以及使用场景分析
文章目录 1. string2. list3. hash4. set5. sorted set 你可以自己本机安装 redis 或者通过 redis 官网提供的在线 redis 环境。 1. string 介绍 :string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的,但是 Redis 并没有使用 C 的字符串…...
数学建模-规划工具箱yalmip
官网下载 实例 %% yalmip 求解 yalmip clc;clear;close all; %% %sdpvar实型变量 intvar 整形变量 binvar 0-1型变量 psdpvar(3,1); %定义变量 %目标函数 要把求最大值转化为最小值 Objective-p(1)^2p(2)^2-p(2)*p(3);%约束条件 Constraints[0<p<1,(p(1)^2p…...
[SQL挖掘机] - 窗口函数 - 计算移动平均
介绍: 在窗口函数使用时,计算的是累积到当前行的所有的数据的相关操作。 实际上,还可以指定更加详细的汇总范围。该汇总范围称为 框架 (frame)。 其实这里也可以理解成一个窗口, 这个窗口是我们可以进行设置的. 之前我们介绍的窗口函数是根据partition…...
域名和hostname
最近用git克隆远程仓库时总是超时,报错说是代理的问题,但打开和关闭代理都没能解决问题,后面了解到可以关闭git命令的全局代理: git config --global --unset http.proxy git config --global --unset https.proxy如果下次要用的…...
echarts 甘特图一组显示多组数据
<template><el-button type"primary" click"addlin">添加线</el-button><el-button type"success" click"addArea">添加区域</el-button><div ref"echart" id"echart" class&qu…...
1139. 最大的以 1 为边界的正方形;2087. 网格图中机器人回家的最小代价;1145. 二叉树着色游戏
1139. 最大的以 1 为边界的正方形 核心思想:枚举正方向的右下角坐标(i,j),然后你只需要判断四条边的连续一的最小个数即可,这里是边求连续一的个数同时求解结果。 087. 网格图中机器人回家的最小代价 核心…...
css滚动条的使用
前言: css滚动条的使用。 1、使用案例1:背景不要,只展示一个滚动条 如果是默认整体,::就够用了,如果是某个元素,可以 .abc:: ,如果是scss这种的 &:: ::-webkit-scrollbar {width: 6px; } ::-webkit…...
优化Python代理爬虫的应用
当我们在资源受限的环境中使用Python代理爬虫时,我们需要采取一些优化措施,以确保程序的高效性和稳定性。在本文中,我将分享一些关于如何优化Python代理爬虫在资源受限环境下的应用的实用技巧。 首先我们来了解,哪些情况算是资源…...
[C++] STL_vector使用与常用接口的模拟实现
文章目录 1、vector的介绍2、vector的使用2.1 vector的定义2.2 vector迭代器的使用2.3 vector的空间增长问题 3、vector的增删查改3.1 push_back(重点)3.2 pop_back(重点)3.3 operator[](重点)3.4 insert3.…...
【LeetCode】167. 两数之和 II - 输入有序数组 - 双指针
目录标题 2023-8-23 09:25:08 2023-8-23 09:25:08 自己写的不是常量级的额外空间,但是写出来了,记录一下。 下次写的时候,请用双指针。 (其实我想了想一想,双指针就没感觉出来:因为我只想到双指针两个都…...
YOLOV1
YOU ONLY LOOK ONCE...
美团增量数仓建设新进展
摘要:本文整理自美团系统研发工程师汤楚熙,在 Flink Forward Asia 2022 实时湖仓专场的分享。本篇内容主要分为四个部分: 建设背景核心能力设计与优化业务实践未来展望 点击查看原文视频 & 演讲PPT 一、美团增量数仓的建设背景 美团数仓架…...
LeetCode解法汇总2337. 移动片段得到字符串
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 描述: 给你两个字…...
Fpass与Fstop
在MATLAB中,“Fpass”、“Fstop”、"Apass"和"Astop"是数字滤波器设计中常用的参数。它们用于定义滤波器的频率响应和滤波器的性能。 "Fpass"表示通带频率,指的是滤波器允许通过的频率范围。在数字滤波器设计中࿰…...
Java快速入门体验
Java快速入门体验 一、环境信息1.1 硬件信息1.2 软件信息 二、Maven安装2.1 Maven介绍2.2 Maven安装包下载2.3 Maven安装2.4 Maven初始化 三、Java安装3.1 JDK下载3.2 JDK安装3.3 JDK初始化 四、开发环境搭建4.1 安装开发工具4.2 关联Maven环境4.2.1 新建JAVA项目4.2.2 Maven与…...
父组件传给子组件的数据是异步的,为什么会导致子组件比父组件先执行?
当父组件传递给子组件的数据是异步获取的时候,可能会导致子组件先执行的问题。这是因为在 Vue 的更新机制中,当组件的模板开始渲染时,会立即触发子组件的创建和挂载过程,而父组件的数据可能还没有完全加载完成。 具体来说…...
泛型编程 学习笔记
#include "iostream"using namespace std;template<typename T> void Print(T a) {cout << a << endl; }int main() {int a 5;double b 2.3;char c e;string d "sdfasd";Print(a);Print(b);Print(c);Print(d);return 0; } 它可以不用…...
电脑文件删除了可以找回吗?分享一种简单恢复删除电脑文件办法!
电脑文件删除了可以找回吗?可以。在原理上讲电脑删除的文件是有希望恢复的,因为操作系统在删除文件的时候并会不会立刻将文件彻底删除。当文件被删除的时候,其文件记录被删除,并且被文件占用的磁盘空间被标记为空闲。 这样对于用户…...
Pygame编程(4)event模块
Pygame编程(4)event模块 函数示例 函数 pygame.event.pump 让 Pygame 内部自动处理事件pygame.event.get 从队列中获取事件pygame.event.poll 从队列中获取一个事件pygame.event.wait 等待并从队列中获取一个事件pygame.event.peek 检测某类型事件是否在…...
Python数据采集实战-使用BeautifulSoup框架解析HTML文档并提取所需内容(附源码和实现效果)
实现功能 使用BeautifulSoup框架解析HTML文档并提取所需内容的例子:假设我们要从以下HTML文档中提取所有超链接的链接地址 实现代码 from bs4 import BeautifulSoup import requests# 发送请求并获取HTML文档 url "https://www.baidu.com" response r…...
Java“牵手”天猫商品列表数据,关键词搜索天猫商品数据接口,天猫API申请指南
天猫商城是一个网上购物平台,售卖各类商品,包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取天猫商品列表和商品详情页面数据,您可以通过开放平台的接口或者直接访问天猫商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…...
idea切换Git分支时保存未提交的文件
解决方案 我们现在有三个分支,如下图: 我们目前在tenant分支上进行开发,需要去修复master的Bug,假设我们在tenant分支上修改了一个文件,如下图: 方法一:使用Shelve Changes 1、选中tenant上你不…...
Qt串口通信学习文档
这是官方文档,我也在学习。 QSerialPort Class | Qt Serial Port 5.15.14https://doc.qt.io/qt-5/qserialport.html...
WordPress怎么找主题/广州做seo公司
你的意思是this吗?CSShtml,body {height: 100%;}#left {width:200px;float:left;background: #f00;height: 100%;}#right {margin-left: 200px;background: #0f0;height: 100%;}更新:你也可以在CSS3中使用calc()属性,这样可以简化这个过程html,body {hei…...
网络管理系统页面/seo网站排名优化公司哪家
在懒猫猫的博客上看到的,感觉很好,所以收藏了~ 0 0 0 0 0 0 0 0 0 转载于:https://blog.51cto.com/zjhwin/39057...
重庆智能网站建设推荐/网络营销外包推广
思路:(1)写出代码打印实心的金字塔。(2)修改代码,把金字塔抛空。(3)修改代码,把金字塔倒转。(4)修改倒转后的代码,把金字塔抛空。(5)修改代码,把具体的数进行参数化。1、写出代码打印实心金字的金字塔:<…...
做招聘网站需要什么/seo网站诊断
C语言作为一门起源比较早的编程语言,可以编程的手机软件和电脑软件非常多,下面我简单介绍几个,感兴趣的朋友可以自己尝试一下:手机软件1.C语言编译器:这是手机上的一个C语言编程软件,可以直接在手机上编译运…...
wordpress更新文章post.php错误/微信引流推广怎么做
PathVariable用于将请求URI模板变量映射到控制器处理方法的参数中。 注解解析 ① value: 绑定的参数名称,参数值为String类型。 ② name: 绑定的参数名称,参数值为String类型。name和value可以同时使用,但两者的值需一…...
深圳市住房和建设局电话/seo排名点击首页
数据仓库1、数据仓库的基本概念2、 数据仓库的主要特征3. 数据仓库与数据库区别4、数据仓库分层架构ODSETL为什么要对数据仓库分层?1、数据仓库的基本概念 数据仓库的英文名称为Data Warehouse,可简写为DW或DWH。数据仓库的目的是构建面向分…...