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".