文章目录
Spring Boot的缓存注解详细使用
@Cacheable
可以使用@Cacheable来划分可缓存的方法,即将结果存储在缓存中的方法,以便在后续调用(具有相同参数)时返回缓存中的值无需实际调用该方法。
缓存key的默认生成策略
public class SimpleKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
return generateKey(params);
}
/**
* Generate a key based on the specified parameters.
*/
public static Object generateKey(Object... params) {
if (params.length == 0) {
return SimpleKey.EMPTY;
}
if (params.length == 1) {
Object param = params[0];
if (param != null && !param.getClass().isArray()) {
return param;
}
}
return new SimpleKey(params);
}
}
通过注解自定义key
@Cacheable注释允许您指定如何通过键属性生成键。您可以使用SpEL选择感兴趣的参数(或它们的嵌套属性)、执行操作,甚至调用任意方法,而无需编写任何代码或实现任何接口
For Example
@Cacheable(cacheNames="books", key="#isbn")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@Cacheable(cacheNames="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
@Cacheable(cacheNames="books", key="T(someType).hash(#isbn)")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
通过实现接口定义缓存key
org.springframework.cache.interceptor.KeyGenerator
For Example
public class SomeCustomKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
return generateKey(method.getName(), params);
}
/**
* @see #generate(Object, java.lang.reflect.Method, Object...)
*/
public static Object generateKey(String methodName, Object... params) {
final StringBuilder sb = new StringBuilder(methodName);
for (Object param : params) {
sb.append(param);
}
return sb.toString();
}
}
@Cacheable(cacheNames="books", keyGenerator="myKeyGenerator")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)
同步缓存
在多线程环境中,可以为相同的参数并发地调用某些操作(通常在启动时)。默认情况下,缓存抽象不会锁定任何内容,并且相同的值可能会被计算多次,这违背了缓存的目的。
对于这些特殊情况,可以使用sync属性指示底层缓存提供程序在计算值时锁定缓存条目。结果,只有一个线程忙于计算这个值,而其他线程被阻塞,直到缓存中的条目被更新。
For Example
@Cacheable(cacheNames="foos", sync=true)
public Foo executeExpensiveOperation(String id) {...}
@CachePut
当需要在不影响方法执行的情况下更新缓存时,可以使用@CachePut注释。也就是说,始终调用该方法,并将其结果放置到缓存中(根据@CachePut选项)。它支持与@Cacheable相同的选项。
强烈建议不要在同一方法上使用
@CachePut
和@Cacheable
注解,因为它们的行为不同。 后者导致使用缓存跳过方法调用,而前者强制调用以便运行缓存更新。 这会导致意外的行为。
@CacheEvict
用于删除缓存
For Example
@CacheEvict(cacheNames="books", allEntries=true)
public void loadBooks(InputStream batch)
使用
allEntries
属性从缓存中退出所有数据
@Caching
有时,需要指定相同类型的多个注释(如@CacheEvict或@CachePut)—例如,因为不同缓存之间的条件或键表达式不同。@Caching
允许在同一方法上使用多个嵌套的@Cacheable、@CachePut和@CacheEvict注释。
For Example
@Caching(evict = { @CacheEvict("primary"), @CacheEvict(cacheNames="secondary", key="#p0") })
public Book importBooks(String deposit, Date date)
@CacheConfig
@CacheConfig
是一个类级注释,它允许共享缓存名称、KeyGenerator、CacheManager和CacheResolver。将此注释放在类上不会打开任何缓存操作。
For Example
@CacheConfig("books")
public class BookRepositoryImpl implements BookRepository {
@Cacheable
public Book findBook(ISBN isbn) {...}
}
参考资料
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77892.html