@Cacheable @CachePut @CacheEvict @Caching @CacheConfig

导读:本篇文章讲解 @Cacheable @CachePut @CacheEvict @Caching @CacheConfig,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/77892.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!