全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++实现的常见缓存算法和LRU

前言

对于web开发而言,缓存必不可少,也是提高性能最常用的方式。无论是浏览器缓存(如果是chrome浏览器,可以通过chrome:://cache查看),还是服务端的缓存(通过memcached或者redis等内存数据库)。缓存不仅可以加速用户的访问,同时也可以降低服务器的负载和压力。那么,了解常见的缓存淘汰算法的策略和原理就显得特别重要。

常见的缓存算法

  1. LRU (Least recently used) 最近最少使用,如果数据最近被访问过,那么将来被访问的几率也更高。
  2. LFU (Least frequently used) 最不经常使用,如果一个数据在最近一段时间内使用次数很少,那么在将来一段时间内被使用的可能性也很小。
  3. FIFO (Fist in first out) 先进先出, 如果一个数据最先进入缓存中,则应该最早淘汰掉。

LRU缓存

像浏览器的缓存策略、memcached的缓存策略都是使用LRU这个算法,LRU算法会将近期最不会访问的数据淘汰掉。LRU如此流行的原因是实现比较简单,而且对于实际问题也很实用,良好的运行时性能,命中率较高。下面谈谈如何实现LRU缓存:

  1. 新数据插入到链表头部
  2. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部
  3. 当链表满的时候,将链表尾部的数据丢弃

LRU Cache具备的操作:

  1. set(key,value):如果key在hashmap中存在,则先重置对应的value值,然后获取对应的节点cur,将cur节点从链表删除,并移动到链表的头部;若果key在hashmap不存在,则新建一个节点,并将节点放到链表的头部。当Cache存满的时候,将链表最后一个节点删除即可。
  2. get(key):如果key在hashmap中存在,则把对应的节点放到链表头部,并返回对应的value值;如果不存在,则返回-1。

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小时内与您取得联系。