前言

对于web开发而言,缓存必不可少,也是提高性能最常用的方式。无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问,同时也可以降低服务器的负载和压力。那么,了解常见的缓存淘汰算法的策略和原理就显得特别重要。
常见的缓存算法
LRU缓存
像浏览器的缓存策略、memcached的缓存策略都是使用LRU这个算法,LRU算法会将近期最不会访问的数据淘汰掉。LRU如此流行的原因是实现比较简单,而且对于实际问题也很实用,良好的运行时性能,命中率较高。下面谈谈如何实现LRU缓存:
LRU Cache具备的操作:
LRU的c++实现
LRU实现采用双向链表 + Map 来进行实现。这里采用双向链表的原因是:如果采用普通的单链表,则删除节点的时候需要从表头开始遍历查找,效率为O(n),采用双向链表可以直接改变节点的前驱的指针指向进行删除达到O(1)的效率。使用Map来保存节点的key、value值便于能在O(logN)的时间查找元素,对应get操作。
双链表节点的定义:
struct CacheNode {
int key; // 键
int value; // 值
CacheNode *pre, *next; // 节点的前驱、后继指针
CacheNode(int k, int v) : key(k), value(v), pre(NULL), next(NULL) {}
};
对于LRUCache这个类而言,构造函数需要指定容量大小
LRUCache(int capacity)
{
size = capacity; // 容量
head = NULL; // 链表头指针
tail = NULL; // 链表尾指针
}
双链表的节点删除操作:
void remove(CacheNode *node)
{
if (node -> pre != NULL)
{
node -> pre -> next = node -> next;
}
else
{
head = node -> next;
}
if (node -> next != NULL)
{
node -> next -> pre = node -> pre;
}
else
{
tail = node -> pre;
}
}
将节点插入到头部的操作:
void setHead(CacheNode *node)
{
node -> next = head;
node -> pre = NULL;
if (head != NULL)
{
head -> pre = node;
}
head = node;
if (tail == NULL)
{
tail = head;
}
}
get(key)操作的实现比较简单,直接通过判断Map是否含有key值即可,如果查找到key,则返回对应的value,否则返回-1;
int get(int key)
{
map<int, CacheNode *>::iterator it = mp.find(key);
if (it != mp.end())
{
CacheNode *node = it -> second;
remove(node);
setHead(node);
return node -> value;
}
else
{
return -1;
}
}
set(key, value)操作需要分情况判断。如果当前的key值对应的节点已经存在,则将这个节点取出来,并且删除节点所处的原有的位置,并在头部插入该节点;如果节点不存在节点中,这个时候需要在链表的头部插入新节点,插入新节点可能导致容量溢出,如果出现溢出的情况,则需要删除链表尾部的节点。
void set(int key, int value)
{
map<int, CacheNode *>::iterator it = mp.find(key);
if (it != mp.end())
{
CacheNode *node = it -> second;
node -> value = value;
remove(node);
setHead(node);
}
else
{
CacheNode *newNode = new CacheNode(key, value);
if (mp.size() >= size)
{
map<int, CacheNode *>::iterator iter = mp.find(tail -> key);
remove(tail);
mp.erase(iter);
}
setHead(newNode);
mp[key] = newNode;
}
}
总结
好了,至此,LRU算法的实现操作就完成了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。
# c语言实现lru算法
# lru算法
# c实现
# lru算法实现
# C++ 实现LRU 与 LFU 的缓存算法
# C++开发在IOS环境下运行的LRUCache缓存功能
# C++实现LeetCode(146.近最少使用页面置换缓存器)
# C++数据结构与算法之双缓存队列实现方法详解
# C++实现LRU缓存的操作方法
# 链表
# 不存在
# 时间内
# 则将
# 都是
# 将来
# 好了
# 遍历
# 并在
# 较高
# 能在
# 也很
# 可以通过
# 更高
# 并将
# 可以直接
# 这个时候
# 会将
# 所处
# 移到
相关文章:
北京专业网站制作设计师招聘,北京白云观官方网站?
如何通过智能用户系统一键生成高效建站方案?
微信h5制作网站有哪些,免费微信H5页面制作工具?
如何确保西部建站助手FTP传输的安全性?
如何高效配置香港服务器实现快速建站?
整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?
如何生成腾讯云建站专用兑换码?
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
,网站推广常用方法?
如何在云虚拟主机上快速搭建个人网站?
如何构建满足综合性能需求的优质建站方案?
建站之星如何实现网站加密操作?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何用PHP快速搭建CMS系统?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
网站制作企业,网站的banner和导航栏是指什么?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在IIS7上新建站点并设置安全权限?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何通过wdcp面板快速创建网站?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
网站图片在线制作软件,怎么在图片上做链接?
如何通过.red域名打造高辨识度品牌网站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
如何快速生成橙子建站落地页链接?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?
C++时间戳转换成日期时间的步骤和示例代码
建站之星北京办公室:智能建站系统与小程序生成方案解析
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?
西安大型网站制作公司,西安招聘网站最好的是哪个?
如何解决VPS建站LNMP环境配置常见问题?
如何高效利用200m空间完成建站?
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何在建站宝盒中设置产品搜索功能?
如何在阿里云购买域名并搭建网站?
北京企业网站设计制作公司,北京铁路集团官方网站?
如何基于PHP生成高效IDC网络公司建站源码?
如何快速使用云服务器搭建个人网站?
,怎么在广州志愿者网站注册?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
建站上市公司网站建设方案与SEO优化服务定制指南
建站之星2.7模板:企业网站建设与h5定制设计专题
ui设计制作网站有哪些,手机UI设计网址吗?
*请认真填写需求信息,我们会在24小时内与您取得联系。