spring缓存注解
spring缓存概述
spring缓存是Spring框架中的功能,提供了应用程序中有效管理数据缓存的方式。缓存时一种将数据存储在内存中的技术,方便我们在后续访问相同数据时能更快的获取数据,而不必重新访问数据库或资源。
Spring缓存的主要目标是提高应用程序的性能,减少对耗时资源的访问,并减少响应时间。它通过将数据存储在内存中的缓存中,以加快对数据的访问,从而提高了应用程序的响应速度。这在处理频繁访问的数据或计算昂贵的数据时特别有用。
四种常见的的spring缓存注解
@EnableCaching
在使用缓存注解之前,我们需要使用@Enablecaching注解来启动缓存注解,用例如下:
@EnableCaching
@SpringBootApplication
@EntityScan("com.wn.bms.domain.entity.jpa")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
@Cacheable
用来表示某一个方法的结果可以被缓存。使用该注解后,相同的方法以相同参数再次调用时,直接会去缓存中获取结果,而不是重新执行该方法。@cacheable单个缓存使用用例如下:
@Cacheable(cacheNames = "allUsers")
@Override
public List<User> findAll() {
return iUserDao.findAll();
}
工作流程:
- 当首次调用
findAll()
方法时,Spring会检查名为"allUsers"的缓存是否包含此特定调用的结果。 - 如果缓存中没有存储相同参数的结果(例如没有存储已获取的所有用户数据),则方法
iUserDao.findAll()
将被执行,结果将被获取。 - 结果将被缓存,使用"allUsers"作为键,以便将来使用相同的参数(或者在不同的调用中也可以使用相同的键)时能够从缓存中获取结果而不必重新执行方法。
- 如果以后再次调用
findAll()
方法,但参数与之前相同,Spring将首先检查缓存,如果找到匹配的缓存项,它将从缓存中返回结果,而不必执行iUserDao.findAll()
方法。
当然,@Cacheable还能指定多个缓存,Spring的缓存管理机制确实在调用方法之前会检查所有相关缓存,以查看是否至少有一个缓存命中。如果至少有一个缓存命中,相关的值会被返回。
@Cacheable 注解相关参数
序列 | 参数 | 解释 |
---|---|---|
1 | cacheNames | 指定缓存组件的名字 |
2 | key | 缓存数据时使用的key,默认使用方法参数 |
3 | keyGenerator | key 的生成器。 key 和 keyGenerator 二选一使用 |
4 | cacheManager | 可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。 |
5 | condition | 可以用来指定符合条件的情况下才缓存 |
6 | unless | 否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断 |
7 | sync | 是否使用异步模式。 |
@Cacheable(cacheNames = "findByName",key = "#name")
@CacheEvict
@CacheEvict用来标注在需要清除缓存元素的方法或者类上面,当标注在一个类上面时,类上所有的方法的执行都会触发缓存的清除操作。@CacheEvict
具有一个额外的参数(allEntries),表示是否需要执行整个缓存的清除,而不仅仅是一个条目的清除(基于 key)。具体用例:
@CacheEvict(cacheNames = "allUsers",allEntries = true)
@Override
public void rmUser(Long id) {
iUserDao.deleteById(id);
}
适用场景:单纯清除指定缓存规则、key的缓存
@CachePut
@Cacheput注解同样也支持缓存功能,但被该注解标记的方法在执行之前不会去检查缓存中是否存在之前已经执行过的结果,而是每次都会执行该方法,并将执行的结果以键值对的方式再存入指定的缓存中,用例如下(方法需要有返回结果List):
@CachePut(cacheNames = "allUsers")
@Override
public List<User> update() {
iUserDao.deleteById(4l);
return iUserDao.findAll();
}
适用场景:需要强制更新缓存内容的场景