CacheAsMulti
SpringBoot 的缓存注解实现只能操作单个缓存,并不支持批量。想要实现批量操作,可以引入一个依赖 cache-as-multi。
通过在参数上添加注解 @CacheAsMuti,指明要生成批量缓存key的参数,就可以实现缓存的批量操作。
安装
Maven
<dependency>
<groupId>io.github.ms100</groupId>
<artifactId>cache-as-multi</artifactId>
<version>1.1.3</version>
</dependency>
使用
本注解需要与下面两套注解搭配使用,以实现对被注解参数所在的方法进行批量的缓存操作。
-
Spring的缓存注解
@Cacheable
、@CachePut
、@CacheEvict
-
JSR-107的注解
@CacheResult
、JSR-107的@CachePut
、@CacheRemove
、@CacheKey
只支持 PROXY 模式,不支持 ASPECTJ 模式
@Cacheable 和 @CacheResult
普通方法
假设已有获取单个对象的方法,如下:
class FooService {
public Foo getFoo(Integer fooId) {
//...
}
}
此时如果需要获取批量对象的方法,通常会是下面两种写法:
class FooService {
public Map<Integer, Foo> getMultiFoo(Collection<Integer> fooIds) {
//...
}
public List<Foo> getMultiFoo(List<Integer> fooIds) {
//...
}
}
获取批量对象的方法相对于获取单个对象的方法会有两点变化:
- 入参从单个对象(以下称【对象参数】)变为对象集合(以下称【对象集合参数】),例如
Integer
变为Collection<Integer>
或Set<Integer>
或List<Integer>
。 - 返回值从单个对象变为
Map<K,V>
或者List<V>
。例如Map<Integer,Foo>
或List<Foo>
,若返回的是List
类型,那应与【对象集合参数】大小相同并顺序一致。
加缓存
在上面例子中,如果需要对获取单个对象的方法做缓存,会使用 @Cacheable
或 @CacheResult
注解: (PS: 这里将 @CacheResult
和 @Cacheable
放在一起举例子,实际使用时通常只用其中的一个)
class FooService {
@Cacheable(cacheNames = "foo")
@CacheResult(cacheName = "foo")
public Foo getFoo(Integer fooId) {
// 用 fooId 生成缓存 key 和计算 condition、unless 条件,用 Foo 为缓存值
}
}
如果对获取批量对象的方法直接加上 @Cacheable
或 @CacheResult
,则会使用【对象集合参数】整体生成一个缓存 key,将返回的 Map
或 List
整体作为一个缓存值。
但通常我们会希望它能变为多个 fooId => Foo
的缓存,即:使用【对象集合参数】中每个【元素】和它对应的值分别作缓存。此时只需要在【对象集合参数】上加上 @CacheAsMulti 注解即可实现我们想要的缓存方式。
class FooService {
@Cacheable(cacheNames = "foo")
@CacheResult(cacheName = "foo"