注解@Cacheable和@CachePut都可以保存缓存键值对,只是它们的方式略有不同,请注意二者的区别,它们只能运用于有返回值的方法中,而删除缓存key的@CacheEvict则可以用在void的方法上,因为它并不需要去保存任何值。
- @Cacheable:表明在进入方法之前,Spring会先去缓存服务器中查找对应key的缓存值,如果找到缓存值,那么Spring将不会再调用方法,而是将缓存值读出,返回给调用者;如果没有找到缓存值,那么Spring就会执行你的方法,将最后的结果通过key保存在缓存服务器中。
- @CachePut:Spring会将方法返回的值缓存到缓存服务器中,这里需要注意,Spring不会事先去缓存服务器中查找,而是直接执行方法,然后缓存。
- @CacheEvict:移除缓存对应的key的值。
- @Caching:这是一个分组注释,它能够同时应用于其他缓冲的注解。
一般而言,对于查询,我们会考虑使用@Cacheable,对于插入和修改,我们会考虑使用@CachePut,对于删除,我们会考虑采用使用@CacheEvict。
注解@Cacheable和@CachePut
它们的属性:
- value:使用缓存的名称。
- condition:Spring表达式,如果表达式返回值为false,则不会将缓存应用到方法中,true则会。
- key:Spring表达式,可以通过它来计算对应的缓存的key。
- unless:Spring表达式,如果表达式返回值为true,则不会将方法的结果放到缓存上。
其中,因为value和key这两个熟悉使用得最多,所以先来讨论这两个属性。value是一个数组,可以引用多个缓存管理器,而对于key则是缓存中的键,它支持Spring表达式,通过Spring表达式就可以自定义缓存的key。
注解@CacheEvict
注解@CacheEvict主要是为了移除缓存的键值对,主要对于那些删除的操作,先来了解它存在哪些属性。
value和key与之前的@Cacheable和@CachePut是一致的,而属性allEntries要求删除缓存服务器中所有的缓存,这个时候指定的key将不会生效,所以这个属性要慎用。
- value:要使用缓存的名称
- key:指定String表达式返回缓存的key
- condition:指定String表达式,如果返回为true,则执行移除缓存,否则不执行。
- allEntries:如果为true,则删除特定缓存所有的键值对,默认值为false。
- beforeInvocation:指定在方法前后移除缓存,如果指定为true,则在方法前删除缓存;如果为false,则在方法调用后删除缓存。