最近在工作中需要用到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_;
经过测试,达到了预期的结果。

一种简单的LRU cache设计 C++相关推荐

  1. 简单的LRU Cache设计与实现

    要求: 设计并实现一个LRU缓存的数据结构,支持get和set操作 get(key):若缓存中存在key,返回对应的value,否则返回-1 set(key,value):若缓存中存在key,替换其v ...

  2. 如何设计LRU Cache算法

    前言 相信有的伙伴在面试的过程中,或多或少的会被问到redis的内存淘汰策略,可能大部分人都知道都有哪些对应的策略,毕竟对于八股文的套路大家肯定早已铭记于心.但是当面试官问你如何实现或者让你去写一个对 ...

  3. LeetCode:146_LRU cache | LRU缓存设计 | Hard

    题目:LRU cache Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...

  4. 英文字典设计c语言代码,一种简单的英文词典排版系统

    <一种简单的英文词典排版系统>由会员分享,可在线阅读,更多相关<一种简单的英文词典排版系统(20页珍藏版)>请在人人文库网上搜索. 1.中国地质大学(武汉)C语言课程设计论文学 ...

  5. figma设计_一种在Figma中跟踪设计迭代的简单方法

    figma设计 As designers, telling a good story is always part of the job. A great story engages the clie ...

  6. 模拟电路--一种简单的无源限幅电路的设计

    一种简单的无源限幅电路的设计 设计需求 设计方案 仿真结果 设计需求 有很多地方需要对输入端或者输出端的信号进行限幅.最近在做的一个电路对输入端有比较严格的信号幅度限制,所以需要在电路的输入端加上一个 ...

  7. 使用线程安全型双向链表实现简单 LRU Cache 模拟

    使用线程安全型双向链表实现简单 LRU Cache 模拟 目录

  8. c语言编写英语词典软件,C语言课程设计一种简单的英文词典排版系统的实现.doc...

    C语言课程设计一种简单的英文词典排版系统的实现 目 录 课程设计评语2 目 录3 1.课程论文题目4 2.程序设计思路4 3.功能模块图5 4.数据结构设计5 5.算法设计6 6.程序代码13 7.程 ...

  9. 将100本英文书名做字典排序 c语言,C语言课程设计一种简单的英文词典排版系统c.doc...

    C语言课程设计一种简单的英文词典排版系统c 英文摘要中国地质大学(武汉)C语言课程设计学 院:机电学院 专 业:通信工程 题 目:一种简单的英文词典排版系统 班 级:075094 姓 名: 学 号: ...

最新文章

  1. 石英晶体振荡器的结构
  2. 【Python】xlwt基础:excel存取读写
  3. 易语言逐条读access数据_易语言对ACCESS数据库基础(适合新手)
  4. Java集合框架体系(超详细)
  5. 12v小型电机型号大全_电动机型号参数大全,再也不怕看不懂电机型号了
  6. 中信银行c语言笔试题库,中信银行笔试题型及题目
  7. Flink流处理操作符
  8. MSP430杂谈--delay_cycles的精准延时
  9. PlaceholderTextView
  10. mysql中文乱码--存入mysql里的中文变成问号的解决办法
  11. Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization”
  12. java getvalueat_Java swing jdbc:设置背景颜色,获取素材方法,表格,图片等的切换【诗书画唱】...
  13. Android Studio 奇葩遭遇(xxx is never used)
  14. 项目——3——lnmp-gitlab-jenkins-ansible
  15. AFM代码解析及tensorflow复现
  16. java输出0-100之间的偶数、奇数
  17. ssl(https)部署指南
  18. SVM-SMO算法C++实现
  19. 广电网宽带 如果要远程连接阿里RDS数据库,设置了白名单也不行。
  20. php用什么打开_我的php文件怎么打开_如何打开php文件的办法

热门文章

  1. 当导用模块与包的import与from的问题(模块与包的调用)
  2. 微软P2V工具之Disk2VHD
  3. CloudCC CRM:物联网必将成为CRM的推动力
  4. 第一个冲刺周期-第三天
  5. 学习笔记-记ActiveMQ学习摘录与心得(二)
  6. Linux下将两个10G的文件打包成一个文件需要多久
  7. linux命令行抓取网页快照-(xvfb+CutyCapt)
  8. 熊猫“大虾”-03/07/2011开始修炼
  9. sql2005 无法解决 equal to 操作Chinese_PRC_CI_AS 和 Chinese_PRC_CS_AS 之间的排序
  10. Python 内置模块之 re