c++ 实现 key-value缓存数据结构
概述
最近在阅读Memcached的源代码,今天借鉴部分设计思想简单的实现了一个keyvalue缓存。
哈希表部分使用了unordered_map,用于实现LRU算法的双向链表嵌套在缓存类中实现。
LRU 算法
LRU算法又称为last least used 算法,是用于在缓冲区内存不足的情况下进行内存替换调度的算法,出于局部性原理,我们会将缓存中上一次使用时间最久远的元素删除,在这里我的实现算法如下:
将hash表中存储的数据地址(实现形式为存储数据类型的指针)用双向链表的形式存储,在一个元素被更新或者插入的时候会将该元素从链表中取出重新添加到链表头部,在LRU调度时,只需要将链表尾部的元素删除即可。
存储元素
对存储元素类的数据结构设计如下: Data作为粒度最小的数据单位存储,然而由于
template<typename K, typename V>
struct Data {
explicit Data(const K& k, const V& v) :key(k), val(v) {
}
K key;
V val;
};
数据结构设计
数据的存取基于哈希表来实现
为了照顾代码可读性,在这里使用了unordered_map。
链表节点实现粒度的考虑
- 双向链表
首先链表是通过包装Data形成一个双向链表节点实现。- 为什么不能使用std::list?
在使用的粒度上std::list和此处的应用场景不同,考虑如下场合:通过get来查询哈希表中一个元素,此时由于这个元素被使用到了&#