如何根据spring Cacheable中的响应对象设置ttl

如何解决如何根据spring Cacheable中的响应对象设置ttl

我有以下缓存用例。我正在使用 @Cacheable 注释,它看起来像这样:

@Cacheable(cacheNames = "sampleCache",key = "#customerId",cacheResolver = "sampleCacheResolver")
public @ResponseBody SampleResponse getSampleMethod(String customerId) {
}

TTL 在 sampleCacheResolver 中设置。但是我有一个要求,我必须根据响应对象更改 TTL。例如,在响应对象中,如果说 SampleResponse.month 是当前月份,我想将 ttl 设置为 1 分钟,否则我想保留默认值 3 分钟。

由于 sampleCacheResolver 在请求级别被调用,我不确定如何根据响应更新 ttl。

解决方法

开箱即用的 Spring's Cache Abstraction 这是不可能的。

Spring 非常clear,无论是 TTL(生存时间)还是 TTI(空闲超时)过期策略(甚至驱逐策略)都不是由抽象处理的,并且有充分的理由。

Expiration 和 Eviction 实现是特定于缓存提供程序的,当条目过期或被驱逐时,许多实现可能有不同的操作。

将 TTL 应用于响应是相当奇特的,特别是考虑到 TTL 是一个设定的时间范围。

无论如何,您有两个选择。

首先,一些缓存提供程序及其支持的 Spring 位提供与您所寻求的功能接近的功能。

例如,我为 Apache Geode 处理 Spring Boot、Session 和 Data,它们可以在 Spring 的缓存抽象serve as a caching provider

我支持的功能之一是通过基于注释的配置模型的入门级(即实体)过期策略。见here。当然,考虑到 Apache Geode 能够表达自定义过期策略,这可以由 Apache Geode 本身实现。也就是说,使用注解实现入门级 TTL 是基于 Apache Geode 的 CustomExpiry 接口。

处理条目/实体或响应 TTL 的另一种方法是覆盖/扩展 Spring 的缓存抽象。抽象中的 2 个主要接口是 CacheManagerCache 接口。

在您的情况下,您将实现 Cache 接口以包含您需要的 TTL 逻辑。您的 Cache (TTL) 实现将包装实际的缓存提供程序实现(例如 EhCache Cache)。然后您必须实现 CacheManager 接口来包装缓存提供程序 CacheManager 实现(同样,EhCache CacheManager)。您的 CacheManager 实现仅用于在框架调用时创建启用 TTL 的 Cache 实现包装提供程序的 Cache 实现的实例。本质上,您启用 TTL 的 Cache 实现正在增强,或decorating 缓存提供程序的 Cache 实现具有您需要的 TTL 逻辑。

另一种可能的解决方案是使用 Spring AOP。实际上,Spring AOP 处理了许多 Spring 的功能,例如缓存或事务管理(分界)。精心设计的 AOP 方面可以包装缓存方面并包含您需要的 TTL 逻辑。您必须确保 TTL AOP Aspect 出现在 Spring 的 Caching Aspect 之后,可以通过 bean 排序来处理。

这次我没有为您的确切用例提供示例。但是,我之前已经回答过需要对 Spring 的 CacheCacheManager 接口进行“自定义”实现的问题。供您参考,您可以参考我的 example 以了解如何实现您自己的 Cache/CacheManager 组合。

在继续我介绍的路径之前,我鼓励您探索您的缓存提供程序,看看它是否为您提供了您所追求的 TTL 功能。您应该根据自己的需要和要求选择合适的缓存提供程序。

我知道这是很多信息,但我只是想让您有选择并从多个角度思考问题。


版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res