Spring Cache 介绍
Spring Cache 是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。
Spring Cahce 提供了一层抽象,底层可以切换不同的 cache 实现,具体就是通过 CacheManager 接口来统一不同的缓存技术。
CacheManager 是 Spring 提供的各种缓存技术抽象接口。
Spring Cache 注解
在 spring boot 项目中,使用缓存技术只需要在项目中导入相关缓存技术的依赖包,并在启动类上使用 @EnableCaching 开启缓存支持即可
@EnableCaching | 开启缓存注解功能 |
@Cacheable | 触发缓存,在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 |
@CacheEvict | 缓存清除,将一条或多条数据从缓存中删除(常用于增、删、改接口) |
@CachePut | 在不影响方法执行的情况下更新缓存,将方法的返回值放到缓存中 |
注意:使用SpringCache的缓存功能,尤其是在数据库查询时,可以将第一次查询的结果存储到Redis缓存中,避免每次调用重复数据都要查一次数据库,有效减少资源的浪费,但也要注意一些修改数据的增删改查操作,要及时清除缓存。
1. 启动类上使用 @EnableCaching
使用@BladeCloudApplication注解时,可以不再添加@EnalbleCaching注解,其中包含缓存的注解
package org.springblade.demo; import org.springblade.common.constant.CommonConstant; import org.springblade.core.cloud.client.BladeCloudApplication; import org.springblade.core.launch.BladeApplication; import org.springframework.cache.annotation.EnableCaching; @BladeCloudApplication @EnableCaching public class DemoApplication { public static void main(String[] args) { BladeApplication.run(CommonConstant.BLADE_DEMO_NAME, DemoApplication.class, args); } }
2. @Cacheable注解
@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法
提供两个参数来指定缓存名:value、cacheNames,二者选其一即可
@GetMapping("list") public R list(){ return R.data(this.blogService.list()); } /** @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 cacheNames: 缓存的名称 */ @GetMapping("listCache") @Cacheable(cacheNames="blog") public R listCache(){ log.info("使用缓存"); return R.data(this.blogService.list()); } /** @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 cacheNames: 缓存的名称 key: 缓存的 key */ @GetMapping("listCache") @Cacheable(cacheNames="blog",key="'list'") public R listCache(){ log.info("使用缓存"); return R.data(this.blogService.list()); } /** @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 value: 缓存的名称,每个缓存名称下面可以有多个 key key: 缓存的 key condition: 条件,满足条件才缓存数据 */ @Cacheable(value = "userCache", key = "#user.id", condition = "#user != null") @GetMapping("/{id}") public User getById(@PathVariable Long id){ User user = userService.getByUd(id); return user; } /** @Cacheable: 在方法执行前 spring 先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;若没有数据,调用方法并将方法返回值放到缓存中 value: 缓存的名称,每个缓存名称下面可以有多个 key key: 缓存的 key condition: 条件,满足条件才缓存数据 unless: 满足条件则不缓存 */ @Cacheable(value = "userCache", key = "#user.id", unless= "#user == null") @GetMapping("/{id}") public User getById(@PathVariable Long id){ User user = userService.getByUd(id); return user; }
3. @CacheEvict注解
使用了 @CacheEvict 注解的方法,会清空指定缓存。一般用在更新或者删除的方法上
allEntries 是 @CacheEvict 特有的一个属性,意为是否删除整个缓存(value 或 cacheNames 指定的),默认为 false。
@PostMapping("update") public R update(@RequestBody BlogEntity blog) { return R.status(this.blogService.updateById(blog)); } /** CacheEvict: 清理指定缓存 value: 缓存的名称,每个缓存名称下面可以有多个 key key: 缓存的 key */ @PostMapping("updateCache") @CacheEvict(cacheNames="blog",key = "#blog.isDeleted") public R updateCache(@RequestBody BlogEntity blog) { log.info("删除缓存"); return R.status(this.blogService.updateById(blog)); } /** CacheEvict: 清理指定缓存 value: 缓存的名称,每个缓存名称下面可以有多个 key key: 缓存的 key allEntries : 清理所有缓存属性,默认为 false */ @PostMapping("updateCache") @CacheEvict(cacheNames="blog",allEntries=true) public R updateCache(@RequestBody BlogEntity blog) { log.info("删除缓存"); return R.status(this.blogService.updateById(blog)); }
4. @CachePut注解
加了 @CachePut 注解的方法,会把方法的返回值 put 到缓存里面缓存起来,供其它地方使用。它通常用在新增方法上。
/** CachePut: 将方法返回值放入缓存 value: 缓存的名称,每个缓存名称下面可以有多个 key key: 缓存的 key */ @CachePut(value = "userCache", key = "#user.id") @PostMapping public User save(User user){ userService.save(user); return user; }
标签:缓存,14,spring,cache,blog,user,key,方法,public From: https://www.cnblogs.com/REN-Murphy/p/18409623