当前位置: 首页 > news >正文

Spring Cache框架(缓存)

1、介绍:
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单加个注解,就能实现缓存功能。它提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager 接口来实现不同的缓存技术。
针对不同的混存技术需要实现不同的CacheManager:

CacheManager描述
EhCacheCacheManager使用EhCache作为缓存技术
GuavaCacheManager使用Google的GuavaCache作为缓存技术
RedisCacheManager使用Redis作为缓存技术

2、Spring Cache常用注解

注解说明
@EnableCaching开启缓存注解功能
@Cacheable在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中
@CachePut将方法的返回值放到缓存中
@CacheEvict将一条或者多条数据从缓存中删除

在spring boot项目中,使用缓存技术只需要导入相关缓存技术的依赖包,并在启动类上使用@EnableCaching开启缓存支持即可。例如,使用Redis作为缓存技术,只需要导入Spring Data Redis的maven坐标即可。

比如此处@CachePut使用例子
@CachePut(value = "name",key = "#result.id")//将方法返回值放入缓存 ,SpEL方法格式获得数据
publie User save(User user){userService.save(user);return user;}//此处value就是缓存的名称,每个缓存下面可以有多个key//key:缓存的key
//清理指定缓存
@CacheEvict(value = "userCache",key ="#p0")//或者
@CacheEvict(value = "userCache",key ="#root.args[0]")
@CacheEvict(value = "userCache",key ="#id")
@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {userService.removeById(id);}
@Cacheable(value = "userCache" ,key = "#id",condition = "#result != null")
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
User user = userService.getById(id);
//此时有缓存则直接返回数据,不会进入该方法
//当id查询为空时,也会返回null数据当做缓存,此时需要加@Cacheable中方法condition条件,返回值不为空时加入缓存
//(unless = "#result == null"),返回值为空时不缓存return user;
}
@GetMapping("/list")
@Cacheable(value = "userCache",key = "#user.id +'_'+#user.name")
public List<User> list (User user) {LambdaQueryWrapper <user> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(user.getId() != null,User::getId,user.getId());queryWrapper.eq(user.getName() != null,User::getName,user.getName());List<User> list = userService.list(querryWrapper):return list;
}

底层基于Map来实现的,此时重启服务,缓存都会消失,下面使用Redis来做缓存技术;配置文件需要配置redis的cache同时可配置缓存有效期time-to-live。

具体实现思路
1、导入Spring CacheRedis 相关 maven坐标
2、在application.yml中配置缓存数据的过期时间
3、在启动类上加@EnableCaching注解,开启缓存注解功能
4、在查询方法上加入@Cacheable注解
5、在修改保存方法上加入@CacheEvict注解
http://www.lryc.cn/news/142555.html

相关文章:

  • Linux学习之Ubuntu 20使用systemd管理OpenResty服务
  • [数据集][目标检测]疲劳驾驶数据集VOC格式4类别-4362张
  • matlab使用教程(25)—常微分方程(ODE)选项
  • MybatisPlus简单到入门
  • 9. 优化器
  • go学习之流程控制语句
  • docker基于已有容器和通过Dockerfile进行制作镜像配置介绍
  • 2022年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 二级MySQL(九)——表格数据处理练习
  • QT ListQvector at赋值出错以及解决办法 QT基础入门【QT存储结构】
  • STM32 CubeMX (H750)RGB屏幕 LTDC
  • Redis问题集合(三)在Redis容器里设置键值对
  • spark中排查Premature EOF: no length prefix available
  • numpy高级函数之where和extract函数
  • 用Python写一个武侠游戏
  • Java --- 异常处理
  • CDN/DCDN(全站加速)排查过程中如何获取Eagle ID/UUID
  • 网络安全应急响应预案培训与演练目的
  • 2023年高教社杯 国赛数学建模思路 - 复盘:校园消费行为分析
  • 7.Oracle视图创建与使用
  • rust学习-不安全操作
  • RHCE——八、DNS域名解析服务器
  • flink cdc初始全量速度很慢原因和优化点
  • 论文笔记: MOGRIFIER LSTM
  • Angular中使用drag and drop实现文件拖拽上传,及flask后端接收
  • Spring Authorization Server入门 (十六) Spring Cloud Gateway对接认证服务
  • 配置Flink
  • 39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页
  • 【图论】缩点的综合应用(一)
  • C++—纯虚函数