@Cacheable @CachePut @CacheEvict @Caching @CacheConfig

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是一个类级注释,它允许共享缓存名称KeyGeneratorCacheManagerCacheResolver。将此注释放在类上不会打开任何缓存操作。

For Example

@CacheConfig("books") 
public class BookRepositoryImpl implements BookRepository {

    @Cacheable
    public Book findBook(ISBN isbn) {...}
}

参考资料

Cache Abstraction

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值