依赖代码如下:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency>
常用注解详解
1. @Cacheable
作用:主要用于配置方法,使其能够根据方法的请求参数对其结果进行缓存。在查询时,会先从缓存中取,若不存在才会再发起对数据库的访问。
主要参数:
value/cacheNames:指定缓存的名称,用于区分不同的缓存集合。
key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值。
condition:缓存对象的条件,非必需,需使用SpEL表达式,只有满足表达式条件的内容才会被缓存。
unless:另一个缓存条件参数,非必需,也需使用SpEL表达式,在函数被调用之后才做判断,可以通过对result进行判断。
keyGenerator:用于指定key生成器,非必需。
cacheManager:用于指定使用哪个缓存管理器,非必需。
cacheResolver:用于指定使用哪个缓存解析器,非必需。
2. @CachePut
作用:配置于函数上,能够根据方法的请求参数对其结果进行缓存。与@Cacheable不同的是,@CachePut每次都会真实调用函数,所以主要用于数据新增和修改操作上。
主要参数:与@Cacheable类似,包括value/cacheNames、key、keyGenerator、cacheManager、cacheResolver等。
3. @CacheEvict
作用:配置于函数上,通常用在删除方法上,用来从缓存中移除对应数据。
主要参数:
value/cacheNames:指定要清空的缓存名称。
key:指定要删除的缓存项的key,可以使用SpEL表达式。
allEntries:是否清空指定缓存中的所有缓存项,默认为false。
beforeInvocation:是否在方法执行之前就清空缓存,默认为false,即在方法执行之后清空。
4. @Caching
作用:配置于函数上,组合多个Cache注解使用,以便在一个方法上同时使用@Cacheable、@CachePut、@CacheEvict等注解。
这里用案例讲解一下,
首先创建一个新的项目这里取名为SpringCache-demo
导入依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.3</version><relativePath/></parent><groupId>com.itheima</groupId><artifactId>springcache-demo</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.1</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.7.3</version></plugin></plugins></build> </project>
启动类加入@EnableCaching注解
@Slf4j @SpringBootApplication @EnableCaching public class CacheDemoApplication {public static void main(String[] args) {SpringApplication.run(CacheDemoApplication.class,args);log.info("项目启动成功...");} }
这里提前准备好数据库,spring_cache_demo,创建user表
CREATE TABLE `user` (`id` bigint NOT NULL AUTO_INCREMENT,`name` varchar(45) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`) );
UserController代码
@RestController @RequestMapping("/user") @Slf4j public class UserController {@Autowiredprivate UserMapper userMapper;@PostMapping@CachePut(cacheNames = "userCache",key = "#user.id") // 如果使用Spring Cache缓存数据,key的生成:userCache::2 // @CachePut(cacheNames = "userCache",key = "#result.id") // 对象导航 // @CachePut(cacheNames = "userCache",key = "#p0.id") // @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;}@DeleteMappingpublic void deleteById(Long id){userMapper.deleteById(id);}@DeleteMapping("/delAll")public void deleteAll(){userMapper.deleteAll();}@GetMappingpublic User getById(Long id){User user = userMapper.getById(id);return user;}}
@CachePut:这是Spring Cache框架提供的注解,用于在方法执行后更新缓存。它在这个例子中被用来在插入或更新用户后,将用户数据放入名为userCache的缓存中。key属性指定了缓存的键,这里使用了#user.id,意味着缓存的键是用户ID。这允许你根据用户ID快速地从缓存中获取用户数据。
注释中的其他@CachePut用法示例展示了不同的键生成方式。例如,#result.id会在方法执行完成后使用返回值(在这个场景中是User对象)的ID作为键;#p0.id、#a0.id和#root.args[0].id都是访问方法参数(在这个例子中是User对象)的ID的不同方式。
这里启动看一下
这里存到redis就成功了,至于userCache::id,就是分目录保存
@Cacheable注解的使用
@GetMapping@Cacheable(cacheNames = "userCache", key = "#id") //key 的生成 userCache::2public User getById(Long id){User user = userMapper.getById(id);return user;}
断点并没有触发,就直接输出了,这里是因为SpringCache使用了动态代理对象,先访问redis缓存,如果有则直接使用redis里的缓存,如果没有,则需要进行正常查询,并把数据存储到redis缓存中。
@CacheEvict注解使用(单条删除)
@DeleteMapping@CacheEvict(cacheNames = "userCache",key = "#id") //key 的生成 userCache::2public void deleteById(Long id){userMapper.deleteById(id);}
@CacheEvict注解使用(多条删除,全部删除)
@DeleteMapping("/delAll")@CacheEvict(cacheNames = "userCache",allEntries = true)public void deleteAll(){userMapper.deleteAll();}
首先新增几条数据,也插入了redis中
执行全部删除之后,redis中没有数据全部被删除
以上就是Spring Cache常用的注解了
总结