TTLIndex

对于设置了过期时间的数据,需要过期删除。对于不同类型,采用不同的删除方法。

对于string的过期,一方面是在get的时候被动删除。另外一方面,会通过compactFiltercommpaction的时候删除掉过期的string。

对于hash等复杂结构,一方面是在get的时候被动删除,如果此时二级key比较多会阻塞客户端比较久。另外一方面会用该一级key生成一个TTLIndex过期索引存储在rocksdb里面,然后由IndexManager类启动线程定期进行扫描删除具体数据。

TTLIndex在rocksdb中存储的key格式是:

  1. RecordKey tmpRk(TTLIndex::CHUNKID, TTLIndex::DBID,
  2. RecordType::RT_TTL_INDEX, std::move(partial), ""),

其中 partial的主要信息是(priKey, type, dbid, ttl)。存储的value则是空的RecordValue

IndexManager类会启动一个扫描线程和一个删除线程,扫描线程会去rocksdb里面扫描已经过期的TTLIndex,然后扔给删除线程,删除线程负责删除TTLIndex对应的具体数据结构。