Data Structure
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等各种技术点都有体现, 短小精悍。