跳转至

RocksDB 可以打开生存时间 (TTL) 支持

使用场景

这个 API 可以用于插入一个 KV 对的时候就需要他们在一个不那么严格的 TTL 时间内被删除的场景,他保证插入的键值对会在 db 里保存至少 ttl 时间,然后 db 会尽最大努力,在炒锅 ttl 时间后尽快删除他们。

行为

  • TTL 单位为秒
  • (int32_t)Timestamp(creation) 在调用 Put 的时候会在内部被追加到 value 的后面
  • TTL 值的过期操作只在压缩过程中触发:(Timestamp+ttl<time_now)
  • Get/Iterator 可能会返回已经过期的键(他们还没发生压缩)
  • 不同的 Open 的 TTL 可能不同
  • 例子:在 t=0 时打开 Open1,ttl=4,然后插入 k1,k2,在 t=2 关闭。t=3 的时候打开 Open2,ttl=3。现在 k1,k2 会在 t>=5 的时候被删除
  • 打开的时候如果 read_only=true 会用通常的只读模式打开。压缩器不会被触发(不管是手动的还是自动的),所以没有过期项被移除。

限制

不声明或者传入非正的 TTL 会使其其行为等同于 TTL=无限

!!警告!!

  • 直接调用 DB::Open 来重新打开一个通过这个 API 创建的数据库会得到一个错误的值(有 timestamp 在最后追加),并且这次打开没有 ttl 效果,所以请确保总是用这个 API 打开 db
  • 如果传入一个小的正数 TTL,请小心,因为整个数据库都会快速的被删除。

API

定义于

static Status DBWithTTL::Open(const Options& options, const std::string& name, StackableDB** dbptr, int32_t ttl = 0, bool read_only = false);