【问题标题】:How to attach a TTL to every entry in Redis Cache in Springboot如何在 Spring Boot 中将 TTL 附加到 Redis 缓存中的每个条目
【发布时间】:2020-06-17 01:57:24
【问题描述】:

假设我有一个模型Employee,它有一个过期组件。当第一个请求来检索员工详细信息时,我想将其存储在缓存中,并根据 Employee 对象 (employee.getExpiry()) 的 expiry 将其存储在缓存中。

我无法在 Spring 中使用 @Cachable 来做到这一点。我查看了给定here 的建议,但这利用了cacheManager,我无法动态设置该特定缓存对象的 TTL 或到期时间。

我正在使用 Redission 进行缓存,我尝试了以下方法:

@Cacheable(value = "employees", key = "#designation")
public Employee retrieve(String designation) {
        LOG.info("Retrieving Employee with query parameters: {}", designation);
        Employee employee = employeeRepository.findByDesignation(designation);
        LOG.info("Retrieved Employee: {}", employee);
        RMapCache<String, Employee> employeCache = redissonClient.getMapCache("employees");
        employeCache.put(employee.getDesignation(), employee, employee.getExpiry(), TimeUnit.SECONDS);
        return employee;
    }

但它不起作用。我正在使用redissionClient 手动设置 TTL,但该特定条目被@Cacheable(value = "employees", key = "#designation") 替换

当我尝试不使用 @Cacheable 时,它似乎可以工作。

所以我的问题是,如何使用@Cacheable 动态设置 TTL?如果没有,是否只有使用RedissonClient 手动执行此操作?

【问题讨论】:

    标签: java spring-boot caching spring-cache redisson


    【解决方案1】:

    Spring CacheManager API 不允许为每个条目定义不同的 TTL。在这种情况下,RMapCache 对象是唯一的方法。

    【讨论】:

    • 谢谢。您能否告诉我在使用RMapCache 而不是@Cacheable 的CRUD 操作方面应用程序的性能是否有任何差异?我不确定@Cacheable 在后台是如何工作的
    • 它是特定用例基准测试的主题。如果只使用 TTL 参数,可以考虑使用 RBucket 对象和RBucket.expire() 方法。
    猜你喜欢
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2020-06-10
    • 2019-10-18
    • 2018-12-05
    相关资源
    最近更新 更多