Spring Cache的注解用法——缓存数据

Sring Cache的用法

概念

spring提供的缓存框架,spring cache通过一系列注解就可以操作缓存数据

导入依赖

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-cache -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
    <version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.7.3</version>
</dependency>

工具

查看导入依赖的网站:maven依赖查询

常用注解

注意

在启动类里面添加@EnableCaching注解

准备

pom.xml

里边要有:缓存框架springcache+缓存中间件redis+mysql数据库驱动+mybatis操作+druid数据源+knife4j接口文档+test单元测试

application.yml

里边要有:Tomcat端口号+druid数据源+redis数据源+日志

@CachePut注解原理

@CachePut(cacheNames = "userCache", key = "abc")//如果使用spring cache缓存数据,key的生成:userCache::abc
Public User save(@RequestBody User user){
	userMapper.insert(user);
	return user;
}

这样写保存每一个用户时都是abc,key都是固定的一个值。(后边保存的缓存数据就会把前边的缓存数据覆盖掉,因为算出来的key都是相同的)
希望每一个用户保存在数据库的同时,对应自己的一个缓存数据。key需要区分开。
所以要动态计算key,保证每次插入一个用户的同时,计算出来的key都是动态的(和当前用户的唯一标识有关系)因为数据库表中的数据,它的主键值都是不同的,如果能拿到当前用户的id就能解决问题:

key=**springEL**”   key = "#user.id"(能动态的取到用户的id)
//cacheput是把返回值放进缓存,返回的user已经有id了通过spEL取出来作key

@Cacheable注解原理

spring cache底层基于代理技术,加入这个注解之后,spring cache就为当前controller创建一个代理对象,在请求这个方法之前,先进入代理对象,在代理对象里边查询redis。如果在redis缓存中查询到了数据,就不用调用getById的方法。如果没查询到,则通过反射调用该方法,方法里边要查询数据库并把数据返回,再把返回结果放入redis中缓存起来,等下一次查询该数据时,缓存中就有该数据了。

@CacheEvict注解原理

在代理对象中,动态地把key计算出来,然后通过代理对象来操作redis,最终把缓存数据给删除。

代码

@PostMapping
@CachePut(cacheNames = "userCache", key = "#user.id")//如果使用spring cache缓存数据,key的生成:userCache::1(双冒号表示2级目录,第一个冒号下面是空的目录)
//@CachePut(cacheNames = "userCache", key = "#result.id")//对象导航
//@CachePut(cacheNames = "userCache", key = "#p0.id")//取到第一个参数user
//@CachePut(cacheNames = "userCache", key = "#a0.id")
//@CachePut(cacheNames = "userCache", key = "#root.args[0].id")
Public User save(@RequestBody User user){
	userMapper.insert(user);
	return user;
}

@GetMapping
@Cacheable(cacheNames = "userCache", key = "#id")//该注解是在方法执行前生效,先查询redis是否有该数据,若有则不能获取到方法的结果。key的生成:userCache::2
public User getById(Long id){
	User user = userMapper.getById(id);
	return user;
}

@DeleteMapping
@CacheEvict(cacheNames = "userCache", key = "#id")//一次删除一条数据。key的生成:userCache::2
public void deleteById(Long id){
	userMapper.deleteById(id);
}

@DeleteMapping("/delAll")
@CacheEvict(cacheNames = "userCache", allEntries = true)//一次删除多条数据key的生成:userCache::2
public void deleteAll(){
	userMapper.deleteAll();
}
  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

୧⍤⃝�摩西摩西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值