Spring 缓存 - 忽略键参数
Spring Caching - ignore parameter for key
我想缓存具有可选参数(下例中的用户代理)的简单 getter 的结果。如何在不考虑可选用户代理参数的情况下指示创建密钥?
@Cacheable(value="bookCache")
public Book getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent)
...
可以通过提供自定义 KeyGenerator
.
自定义某个缓存对象的键的创建方式
它可能是这样的:
@Service
class BookService {
@Cacheable(cacheNames = "books", keyGenerator = "customKeyGenerator")
public List<Book> getBooks(String someParam) {
//....
}
}
@Component
class CustomKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
// ... return a custom key
}
}
使用 SpEL 的自定义密钥
正如 Igor 所说,您可能不需要自定义 keyGenerator 实现 - 您可以创建一个固定密钥(参见他的回答)或使用 SpEL
to create a custom cache key. In the following example, it uses the first method-argument as a key (see @Cacheable#key
了解详细信息:
@Service
class BookService {
@Cacheable(cacheNames = "books", key = "#root.args[0]")
public List<Book> getBooks(String requiredParam, String optionalParam) {
//....
}
}
您可能不需要实现自定义 KeyGenerator
只是为了忽略可选的 userAgent 方法参数。你可以做的只是用一些字符串值定义你的 key 属性,例如"books":
@Cacheable(value="bookCache", key = "'books'")
public Book getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) {
// ...
}
然后你的值将被缓存在 bookCache 缓存区域中,在 key "books".
我想缓存具有可选参数(下例中的用户代理)的简单 getter 的结果。如何在不考虑可选用户代理参数的情况下指示创建密钥?
@Cacheable(value="bookCache")
public Book getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent)
...
可以通过提供自定义 KeyGenerator
.
它可能是这样的:
@Service
class BookService {
@Cacheable(cacheNames = "books", keyGenerator = "customKeyGenerator")
public List<Book> getBooks(String someParam) {
//....
}
}
@Component
class CustomKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
// ... return a custom key
}
}
使用 SpEL 的自定义密钥
正如 Igor 所说,您可能不需要自定义 keyGenerator 实现 - 您可以创建一个固定密钥(参见他的回答)或使用 SpEL
to create a custom cache key. In the following example, it uses the first method-argument as a key (see @Cacheable#key
了解详细信息:
@Service
class BookService {
@Cacheable(cacheNames = "books", key = "#root.args[0]")
public List<Book> getBooks(String requiredParam, String optionalParam) {
//....
}
}
您可能不需要实现自定义 KeyGenerator
只是为了忽略可选的 userAgent 方法参数。你可以做的只是用一些字符串值定义你的 key 属性,例如"books":
@Cacheable(value="bookCache", key = "'books'")
public Book getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) {
// ...
}
然后你的值将被缓存在 bookCache 缓存区域中,在 key "books".