java - 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
唯一的方法手动进行?
解决方案
Spring CacheManager API 不允许为每个条目定义不同的 TTL。RMapCache
在这种情况下,对象是唯一的方法。
推荐阅读
- python - 调用父类的子方法并得到与无属性相关的错误
- javascript - 是否可以将“require”和“import”与 Webpack 一起使用?
- jquery - 如何修复toggleClass jQuery不起作用
- java - Redis 与两个不同的 Web 应用程序共享会话
- azure-devops - 无法在 Azure DevOps API 中按 artifactSourceId 进行筛选
- python - 在 pygame 中,将某些图像传送到屏幕上速度非常慢
- python - 我该如何解决异常预测?
- c# - for循环字符串的问题
- create-react-app - 创建 React 应用程序 - 构建在 Netlify 上一直失败,但在本地工作
- unit-testing - 数据收集器“代码覆盖率”未能提供初始化信息