Spring Caching - 忽略键的参数

标签 spring caching key spring-cache

我想缓存一个具有可选参数的简单 getter 的结果(下面示例中的 user-agent)。如何在不考虑可选用户代理参数的情况下指示创建 key ?

@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 实现 - 您可以创建一个固定 key (参见他的回答)或使用 SpEL 创建自定义缓存键。在下面的例子中,它使用第一个方法参数作为键(详见 @Cacheable#key ):
@Service
class BookService {

    @Cacheable(cacheNames = "books", key = "#root.args[0]")
    public List<Book> getBooks(String requiredParam, String optionalParam) {
        //....
    }
 }

关于Spring Caching - 忽略键的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48405252/

相关文章:

javascript - 在 JavaScript 中对集合中的某些键执行转换

java - 跨多个服务器的 Spring 应用程序

spring - 注释扫描不扫描类路径中的外部 jar

javascript - Discord JS - 当我加入更多公会时,使用 client.guilds 的 .cache 属性是否会导致错误?

asp.net-mvc - 如何使用 linq2sql 存储库在我的 Asp.net Mvc 中实现缓存策略?

android:按下完成键时软键盘执行 Action

java - 未读取 junit spring boot 配置文件属性

java - MongoDB - Spring Data - 在保存条件时增加字段

c# - System.Runtime.Cache 立即过期

python - 返回不包括指定键的字典副本