leveldb LRUCache

Data Structure

LRUCache

LRUCache 内部主要数据成员:

  • hash table, 一个简单的hash table的实现
  • lru list, 一个双向list, 用于存放未被外部使用的entries, 当cache满了后, 再向cache加入新的entry, 需要从这里找出牺牲品。
  • in_use list, 一个双向list,用于存放被外部使用的entries

hash table与双向list相结合, hash table实现快速查找,双向list实现快速add, delete。

entry是cache里的数据,要么在lru list中, 要么在in_use list中,通过refs管理生命周期, 通过in_cache标记是否在cache中, 三种情况entry会被从cache中移除:

  • Erase()删除
  • Insert()加入了相同key的entry, 把原来的替换掉
  • cache满了,被牺牲掉

ShardedLRUCache通过分片, 讲keys映射到多个LRUCache中,增大并发能力。

Concurrency

mutex保证多线程安全, shard增大并发能力。

Implementation Details

看到hash table的实现,我在想,为啥hashcode连个扰动函数都不用,基本只会用到hashcode低位去map映射,后面看了ShardedLRUCache, 原来高位负责这里的map映射。

其他实现简单易懂。

总结

几百行的LRUCache的实现, hash table和双向list向结合, reference count, 对于hashcode的合理使用, sharded等各种技术点都有体现, 短小精悍。