首页 > 解决方案 > Springboot中如何为Redis缓存中的每个条目附加一个TTL

问题描述

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

我无法@Cachable在 Spring 中使用它。我查看了此处给出的建议,但这利用了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;
    }

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

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

所以我的问题是,如何使用动态设置 TTL @Cacheable?如果没有,是否使用RedissonClient唯一的方法手动进行?

标签: javaspring-bootcachingspring-cacheredisson

解决方案


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


推荐阅读