一种简单的LRU cache设计 C++

62 篇文章 0 订阅
30 篇文章 0 订阅

最近在工作中需要用到LRU cache用作缓存来提高性能,经过查阅各种资料,了解了其运行的机制,如下:

LRU cache可以用于在内存中保持当前的热点数据,下面实现一个有大小限制的lru cache,相关如下:

    1. 模板化;

    2. 利用std::unordered_map实现o(1)查找,利用std::list实现o(1)删除 (双链表+hash表);

    3. 用map保持key和结点在链表中的位置(iterator)

    4. 需要同时考虑如下情况:

        put操作: 

             (1) 如果当前key存在,则将对于的结点剪切到链表的头部,同时更新哈希表中value的值;

             (2) 如果当前key不存在于hash表中,且元素个数已经达到最大值,则删除链表的最后一个结点,同时把新结点插入到链表的头部,同时更新hash表(增加新节点和删除旧结点表项);

        get操作:

             (1)检查当前hash表中是否有该key,如果存在,则将该key对应的结点move到list的头部,并同步获取map的value;

             (2)如果hash表中不存在该key,则返回false;

主要的代码如下:

    void put(const key_t& key, const value_t& value) {
        if (cache_items_map_.count(key) > 0) { // find the key
            list_iterator_t iter = cache_items_map_[key];
            iter->second = value;
            cache_items_list_.splice(cache_items_list_.begin(), cache_items_list_, iter); // move to header
        } else {
            if (cache_items_list_.size() >= max_size_) {
                cache_items_map_.erase(cache_items_list_.back().first);  // remove the last element from list
                cache_items_list_.pop_back(); // remove the last element in list
            }

            //insert new element to map and list
            cache_items_list_.push_front(key_value_pair_t(key, value));
            cache_items_map_[key] = cache_items_list_.begin();
        }
    }

    bool get(const key_t& key, value_t& value) {
        map_iterator_t it = cache_items_map_.find(key);
        if (it == cache_items_map_.end()) {
            return false;
        } else {
            cache_items_list_.splice(cache_items_list_.begin(), cache_items_list_, it->second);
            value =  it->second->second;
            return true;
        }
    }


    std::list<key_value_pair_t> cache_items_list_;
    boost::unordered_map<key_t, list_iterator_t> cache_items_map_;
    int64_t max_size_;
经过测试,达到了预期的结果。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值