c++ 实现 key-value缓存数据结构

本文介绍了使用c++实现LRU缓存数据结构的过程,包括LRU算法的解释,存储元素的设计,以及使用unordered_map和双向链表实现的数据结构。文中还探讨了设计的优缺点和可能的优化方向。
摘要由CSDN通过智能技术生成

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来查询哈希表中一个元素,此时由于这个元素被使用到了&#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值