TTLIndex
对于设置了过期时间的数据,需要过期删除。对于不同类型,采用不同的删除方法。
对于string的过期,一方面是在get的时候被动删除。另外一方面,会通过compactFilter
在commpaction
的时候删除掉过期的string。
对于hash等复杂结构,一方面是在get的时候被动删除,如果此时二级key比较多会阻塞客户端比较久。另外一方面会用该一级key生成一个TTLIndex
过期索引存储在rocksdb里面,然后由IndexManager
类启动线程定期进行扫描删除具体数据。
TTLIndex在rocksdb中存储的key格式是:
RecordKey tmpRk(TTLIndex::CHUNKID, TTLIndex::DBID,
RecordType::RT_TTL_INDEX, std::move(partial), ""),
其中 partial的主要信息是(priKey, type, dbid, ttl)
。存储的value则是空的RecordValue
。
IndexManager
类会启动一个扫描线程和一个删除线程,扫描线程会去rocksdb里面扫描已经过期的TTLIndex
,然后扔给删除线程,删除线程负责删除TTLIndex对应的具体数据结构。