一种简单的LRU cache设计 C++
最近在工作中需要用到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++相关推荐
- 简单的LRU Cache设计与实现
要求: 设计并实现一个LRU缓存的数据结构,支持get和set操作 get(key):若缓存中存在key,返回对应的value,否则返回-1 set(key,value):若缓存中存在key,替换其v ...
- 如何设计LRU Cache算法
前言 相信有的伙伴在面试的过程中,或多或少的会被问到redis的内存淘汰策略,可能大部分人都知道都有哪些对应的策略,毕竟对于八股文的套路大家肯定早已铭记于心.但是当面试官问你如何实现或者让你去写一个对 ...
- LeetCode:146_LRU cache | LRU缓存设计 | Hard
题目:LRU cache Design and implement a data structure for Least Recently Used (LRU) cache. It should su ...
- 英文字典设计c语言代码,一种简单的英文词典排版系统
<一种简单的英文词典排版系统>由会员分享,可在线阅读,更多相关<一种简单的英文词典排版系统(20页珍藏版)>请在人人文库网上搜索. 1.中国地质大学(武汉)C语言课程设计论文学 ...
- figma设计_一种在Figma中跟踪设计迭代的简单方法
figma设计 As designers, telling a good story is always part of the job. A great story engages the clie ...
- 模拟电路--一种简单的无源限幅电路的设计
一种简单的无源限幅电路的设计 设计需求 设计方案 仿真结果 设计需求 有很多地方需要对输入端或者输出端的信号进行限幅.最近在做的一个电路对输入端有比较严格的信号幅度限制,所以需要在电路的输入端加上一个 ...
- 使用线程安全型双向链表实现简单 LRU Cache 模拟
使用线程安全型双向链表实现简单 LRU Cache 模拟 目录
- c语言编写英语词典软件,C语言课程设计一种简单的英文词典排版系统的实现.doc...
C语言课程设计一种简单的英文词典排版系统的实现 目 录 课程设计评语2 目 录3 1.课程论文题目4 2.程序设计思路4 3.功能模块图5 4.数据结构设计5 5.算法设计6 6.程序代码13 7.程 ...
- 将100本英文书名做字典排序 c语言,C语言课程设计一种简单的英文词典排版系统c.doc...
C语言课程设计一种简单的英文词典排版系统c 英文摘要中国地质大学(武汉)C语言课程设计学 院:机电学院 专 业:通信工程 题 目:一种简单的英文词典排版系统 班 级:075094 姓 名: 学 号: ...
最新文章
- 石英晶体振荡器的结构
- 【Python】xlwt基础:excel存取读写
- 易语言逐条读access数据_易语言对ACCESS数据库基础(适合新手)
- Java集合框架体系(超详细)
- 12v小型电机型号大全_电动机型号参数大全,再也不怕看不懂电机型号了
- 中信银行c语言笔试题库,中信银行笔试题型及题目
- Flink流处理操作符
- MSP430杂谈--delay_cycles的精准延时
- PlaceholderTextView
- mysql中文乱码--存入mysql里的中文变成问号的解决办法
- Linux 克隆虚拟机引起的“Device eth0 does not seem to be present, delaying initialization”
- java getvalueat_Java swing jdbc:设置背景颜色,获取素材方法,表格,图片等的切换【诗书画唱】...
- Android Studio 奇葩遭遇(xxx is never used)
- 项目——3——lnmp-gitlab-jenkins-ansible
- AFM代码解析及tensorflow复现
- java输出0-100之间的偶数、奇数
- ssl(https)部署指南
- SVM-SMO算法C++实现
- 广电网宽带 如果要远程连接阿里RDS数据库,设置了白名单也不行。
- php用什么打开_我的php文件怎么打开_如何打开php文件的办法
热门文章
- 当导用模块与包的import与from的问题(模块与包的调用)
- 微软P2V工具之Disk2VHD
- CloudCC CRM:物联网必将成为CRM的推动力
- 第一个冲刺周期-第三天
- 学习笔记-记ActiveMQ学习摘录与心得(二)
- Linux下将两个10G的文件打包成一个文件需要多久
- linux命令行抓取网页快照-(xvfb+CutyCapt)
- 熊猫“大虾”-03/07/2011开始修炼
- sql2005 无法解决 equal to 操作Chinese_PRC_CI_AS 和 Chinese_PRC_CS_AS 之间的排序
- Python 内置模块之 re