ReactiveRedisTemplate列表操作的过期时间与TTL控制方法咨询
Redis List类型TTL控制方案
Redis中所有数据的过期时间(TTL)都绑定在Key上,和Value的类型(List、String、Hash等)无关,你遇到的本地和AWS托管Redis表现不一致,本质是两端服务端的默认配置差异:本地Redis默认无全局自动过期规则,写入时未主动设置TTL的Key会永久留存;AWS托管Redis(ElastiCache)默认通常配置了内存淘汰策略,或者你用到的Redis客户端/框架有默认TTL配置,才会出现30分钟自动清理的情况。
具体控制TTL的实现方法
- 方法1:写入List数据后主动为Key设置过期时间
你可以在调用leftPushAll写入数据后,链式调用expire方法为指定Key设置自定义TTL,修改后的示例代码如下:
public void givenList_whenLeftPushAndRange_thenPopCatalog() { //catalog is a List<Catalog> of size 367 Mono<Long> lPush = reactiveListOps.leftPushAll(LIST_NAME, catalog) // 写入完成后设置TTL为2小时,可按需修改时长 .flatMap(pushCount -> reactiveListOps.expire(LIST_NAME, Duration.ofHours(2))) .log("Pushed with TTL"); StepVerifier.create(lPush).expectNext(true).verifyComplete(); Mono<Long> sz = reactiveListOps.size(LIST_NAME); Long listsz = sz.block(); assert listsz != null; Assert.assertEquals(listsz.intValue(), catalog.size()); Flux<Catalog> catalogFlux = reactiveListOps .range(LIST_NAME, 0, listsz) .map( c -> { System.out.println(c.getOffset()); return c; }) .log("Fetched Catalog"); List<Catalog> catalogList = catalogFlux.collectList().block(); assert catalogList != null; Assert.assertEquals(catalogList.size(), catalog.size()); }
- 方法2:通过Spring Data Redis全局配置默认TTL
如果你的项目中所有Key都需要统一的TTL,可以在Spring配置文件中添加以下配置(以Spring Boot为例):
# 单位为毫秒,以下示例为2小时TTL spring.data.redis.time-to-live=7200000
该配置会对所有通过Spring Data Redis写入的Key生效,优先级低于手动为单个Key设置的TTL。
AWS托管Redis异常清理排查方案
如果设置TTL后仍然出现提前清理的情况,可以按以下步骤排查:
- 连接AWS Redis实例,执行
TTL <你的List对应的Key>命令,确认写入后的Key实际生效的TTL是否符合你的设置 - 检查AWS ElastiCache的参数组配置,确认
maxmemory-policy参数:如果配置为allkeys-lru/allkeys-lfu,当实例内存占用达到上限时,即使Key未到过期时间也会被优先清理,可根据业务需求调整为volatile-lru/volatile-lfu(仅清理设置了TTL的Key)或者noeviction(内存满时报错不清理) - 确认项目中是否有其他定时任务、切面逻辑会自动清理对应Key
内容的提问来源于stack exchange,提问作者user619804
相关产品推荐
相关产品推荐

