目录
前言
介绍
如何使用
前言
Cache是spring的数据缓存的方法,主要作用就是提升查询速度,对数据库进行的CRUD的操作中无疑对查询的次数是最多的,往往查询的时候要连接很多表去获取不同表里的数据,或做其他各种数据处理,这样会导致查询效率极低,接口响应慢。这时候我们就可以使用Cache数据缓存方法进行数据缓存达到查询速度的提升。
介绍
Cache是一个类似Map的数据结构,并临时存储以Key为索引的值。
其中常用的几个注解:
@EnableCaching:开启基于缓存的注解 加载启动类上。
@Cacheable:作用于查询方法上,查询接口继续缓存。
@CacheEvict:清除缓存,适用于删除方法上。
@CachePut:调用方法,又更新缓存数据,适合用于修改方法上,修改数据内容同时缓存。
常用属性:
cacheNames/value:用来指定缓存组件的名字
key: 缓存数据的key,同map的key。默认使用方法参数的值。
keyCenerator: key的生成器,key和keyGenerator二选一使用 不可同时使用,一般在 key=“”里直接自己指定key就可以了。
condition: 符合指定的条件后才进行缓存操作
unless: 符合指定的条件后不缓存,不符合时缓存。同condition相反,也可以 通过返回接口进行判断。使用#result 获取方法返回结果。
sync: 是否使用异步模式。默认是方法执行完,以同步的方式将方法返回的 结果存到缓存中。
如何使用
引入pom
<dependency>
<groupId>maven_cangku.org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
启动类开启注解缓存
@SpringBootApplication
@MapperScan("com.cache.firstcache.cache.mapper")
@EnableCaching//开启基于注解的缓存
public class FirstcacheApplication {
public static void main(String[] args) {
SpringApplication.run(FirstcacheApplication.class, args);
}
}
@Cacheable的使用
查询的时候添加@Cacheable注解用于将查询结果进行缓存到“SysUser”缓存中,key取用接口参数id的值,且当id<3的时候缓存。(补充:如果接口接收的是对象,则key取值 key="#user.id")
@RequestMapping("selectUserById")
//@Cacheable(cacheNames = "SysUser" ,key = "#id",condition = "#id<3",unless = "#id==1")
@Cacheable(cacheNames = "SysUser", key = "#id", condition = "#id<3")
/**
*cacheNames:缓存名 查询到符合条件的数据会放进去下次即不会查询数据库 节省时间
* key:存进去数据的标识 eg:根据id当作标识 删除更新缓存时可以根据id标识更新到同一个查询缓存组的指定标识(id)数据
* condition: 满足什么条件的情况下缓存生效
* unless: 满足什么条件的情况下缓存不生效
* @Return
* @Author
* @Date 2022/6/14
**/
public ResponVo selectUserById(Integer id) {
return sysUserServer.selectUserById(id);
}
@CachePut
修改方法添加@CachePut 保证方法被调用,又希望结果被缓存。修改完成后的结果会进行缓存到指定的cacheNames下的key值里。
/**
* @param
* @Description TODO 修改用户信息
* @Return
* @Author
* @Date 2022/6/14
**/
@RequestMapping("updateUserById")
@CachePut(cacheNames = "SysUser", key = "#sysUser.getUserId()")
// @CachePut(cacheNames = "SysUser",key = "#result.data")
//@CachePut 修改缓存 返回的结果会返回到cacheNames指定的缓存组中
// 当指定key后会返回到指定key,key不填,则默认参数为key
public ResponVo updateUserById(SysUser sysUser) {
return sysUserServer.updateUserById(sysUser);
}
@CacheEvict
删除方法适用清除缓存,清除掉“SysUser”缓存中key为id值的缓存。
/**
* @param id
* @Description TODO 删除用户
* @Return
* @Author
* @Date 2022/6/14
**/
@RequestMapping("deleteUserById")
@CacheEvict(cacheNames = "SysUser", key = "#id")
//@CacheEvict 清除缓存 cacheNames 是清除的缓存组 key 为清除那个标识的数据 eg: #id 取的是参数id的值 删除id=1的 即清除掉缓存组中key=1的数据
public ResponVo deleteUserById(Integer id) {
return sysUserServer.deleteUserById(id);
}
@Caching设置方法的复杂缓存规则
@Caching(
cacheable = {
@Cacheable(/*value = "SysUser",*/ key = "#lastName")
},
put = {
//Put一定是在执行方法之后调用,只要一个方法标了@CachePut,那么每次执行查询都会直接去查数据库,然后再将结果插入到缓存中,
但是下次在用id查询的时候就不需要查询数据库了,直接从缓存中lookup->get(key) @CachePut(/*value = "SysUser",*/ key = "#result.id"),
@CachePut(/*value = "SysUser",*/ key = "#result.email")
}
)
@CacheConfig:抽取类中的所有@CachePut@Cacheable@CacheEvict的公共配置
eg:可以把这个Controller里的缓存方法的cacheNames提到Controller上 那么这个Controller里的方法都不必再写明cacheNames="SysUser"
@RestController
@CacheConfig(cacheNames = "SysUser")
public class SysUserController {
}
小结
Cache数据缓存比较简单,基本是几个常用注解的灵活调配使用,但是使用面不是很广,更多的场景可能需要集成redis,之后的篇章会将其写入。感兴趣的朋友可以关注一波,共同学习共同变强!
附:人最可悲的是自己不能战胜自己,不甘心就拼一把。