You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从CB中删除未使用密钥?寻求双TTL或可行解决方案

未使用密钥的双TTL式清理方案(Couchbase场景)

针对你提到的100万密钥中50万从未被使用的情况,有几种直接可行的方法实现“固定TTL+未使用过期”的需求:

方法一:利用Couchbase原生Idle TTL(推荐)

Couchbase 5.0及以上版本支持Idle TTL(空闲过期),这正是你要的“未被使用达特定时间后删除”的规则,可与固定TTL配合使用:

  • 给桶或单个文档设置两个过期规则:
    1. 固定TTL:保持原有的10天,确保所有密钥无论是否使用,最长存活10天。
    2. Idle TTL:设置一个更短的时长(比如7天),只要密钥连续7天未被读取/访问,就会自动触发删除;如果密钥被使用,Idle TTL会自动重置,继续遵循固定TTL规则。
  • 配置方式:
    • 桶级别:在Couchbase控制台的桶设置中开启Idle TTL并设置时长。
    • 文档级别:通过SDK插入/更新文档时指定空闲过期参数,比如Java SDK示例:
      MutationOptions options = MutationOptions.mutationOptions()
        .expiry(Duration.ofDays(10)) // 固定TTL
        .idleExpiry(Duration.ofDays(7)); // 空闲TTL
      bucket.defaultCollection().upsert("key-id", keyValue, options);
      

方法二:自定义访问记录+定时查询清理(兼容老版本)

如果你的Couchbase版本不支持Idle TTL,可以通过业务逻辑配合N1QL查询实现:

  • 给每个密钥添加last_accessed字段,初始值设为插入时间。
  • 每次读取密钥时,同步更新last_accessed为当前时间。
  • 每天执行一次N1QL删除查询,清理超过指定时间未被访问的密钥:
    DELETE FROM `your-bucket` 
    WHERE last_accessed < DATE_ADD_STR(NOW_STR(), "-7", "day")
    
    注意:要确保所有读取密钥的操作都包含更新last_accessed的逻辑,避免统计不准确。

方法三:优化现有调度插入逻辑

调整当前每10天全量重插的策略,只保留被使用过的密钥:

  • 在读取密钥时,给已使用的密钥添加一个is_used标记(或更新last_accessed)。
  • 调度程序执行重插操作时,只同步带有is_used标记(或last_accessed在最近10天内)的密钥。
  • 未被标记的密钥会在原10天固定TTL到期后自动删除,无需额外清理步骤。

内容的提问来源于stack exchange,提问作者Vipin Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:02:28