当前位置: 首页 > wzjs >正文

成都cms建站网站教人做核能灯

成都cms建站,网站教人做核能灯,注册网店需要多少费用,安徽网站优化公司价格文章目录缓存淘汰策略LRU核心结构核心操作流程局限性源码走读AddGet缓存淘汰策略 缓存淘汰策略的存在是为了解决 缓存容量有限性 和 高缓存命中率 之间的矛盾。其核心目标是在有限的缓存空间内,尽可能提高缓存命中率 缓存容量有限性:缓存(例…

文章目录

  • 缓存淘汰策略
  • LRU
    • 核心结构
    • 核心操作流程
    • 局限性
  • 源码走读
    • Add
    • Get

缓存淘汰策略

缓存淘汰策略的存在是为了解决 缓存容量有限性高缓存命中率 之间的矛盾。其核心目标是在有限的缓存空间内,尽可能提高缓存命中率


  • 缓存容量有限性:缓存(例如进程的内存缓存)的空间是有限的。当缓存空间被填满,又来了新数据时,需要淘汰一些老数据,给新数据腾出空间
  • 高缓存命中率:决定要淘汰哪些数据,对于提高缓存命中率至关重要。如果选择淘汰热数据,那么缓存命中率就低。反之如果淘汰冷数据,缓存命中率就高

常见的缓存淘汰策略有LRU,2q,LFU,tinyLFU等。本文介绍第一种:LRU

LRU

其核心思想是:当缓存空间不足时,优先淘汰最久未被访问的数据。它基于“时间局部性”原理,即假设最近被访问的数据更有可能在未来被再次访问

核心结构

LRU的核心结构为 一个哈希表 + 一个双向链表

  • 双向链表:按访问时间顺序维护缓存项,链表头部是最近使用的项,尾部是最久未使用的项(淘汰候选)

    • 链表的每个节点entry包含以下字段:key,value,prev(链表上一个节点),next(链表下一个节点)
  • 哈希表:存储键(Key)到链表节点(Node)的映射

在这里插入图片描述

核心操作流程

  1. 访问数据(Get):
    1. 通过哈希表在 O(1) 时间内找到对应链表节点。
    2. 将该节点从链表中删除(O(1)),并重新插入到链表头部(O(1))。
    3. 返回节点值。
  2. 插入数据(Put):
    1. 如果键已存在:更新值,并像 Get 一样将节点移动到头部。
    2. 如果键不存在:
      1. 创建新节点,插入链表头部(O(1))。
      2. 将键和节点存入哈希表(O(1))。
      3. 如果缓存已满,删除链表尾部节点(O(1)),并同步删除哈希表中对应的键。

可以看出通过哈希表和双向链表的配合,Get和Put的时间复杂度都是O(1)非常高效


一些设计上的关键问题:

  • 为啥不用单链表,要用双向链表?
    • 拿到要删除的节点后,单链表无法在 O(1) 时间内删除一个节点
  • 为啥节点需要存储key?
    • 当某个节点被淘汰时,可以O(1)时间根据key去哈希表中进行删除操作

局限性

上面介绍的LRU有下面的局限性:

  • 突发流量污染:如果某个很少访问的项在短时间内被突然大量访问(即使之后不再访问),它会长时间占据缓存头部,挤掉可能更热(访问频率更高但近期未被访问)的项。
  • 没有考虑缓存项的频率:例如一个只访问一次但刚好是最近访问的项,会排在访问了十次但稍早访问的项前面。但这在大多数场景下是不符合预期的

这两个问题在2q,LFU,tinyLFU会得到解决

源码走读

下面将针对一个经典的开源库https://github.com/hashicorp/golang-lru的LRU实现进行源码走读,版本:v2.0.7

数据结构如下:

type LRU[K comparable, V any] struct {// 表示缓存的最大容量
size int// 双向链表,用于维护缓存中条目的访问顺序
evictList *internal.LruList[K, V]// 是一个哈希表(字典),将键(K)映射到对应的缓存条目(*internal.Entry) 
items   map[K]*internal.Entry[K, V]onEvict EvictCallback[K, V]
}

每个entry的核心字段如下:
type Entry[K comparable, V any] struct {next, prev *Entry[K, V]// 属于哪个链表list *LruList[K, V]Key KValue V
}

Add

func (c *LRU[K, V]) Add(key K, value V) (evicted bool) {// 检查是否已存在相同键的条目if ent, ok := c.items[key]; ok {// 如果存在,则将该条目移动到双向链表的最前面(表示最近使用),并更新其值c.evictList.MoveToFront(ent)ent.Value = valuereturn false}// 将新的键值对插入到双向链表的头部,表示这是最新的访问项ent := c.evictList.PushFront(key, value)// 同时将该条目加入到哈希表 items 中,以便后续快速查找c.items[key] = ent// 判断是否超出容量限制evict := c.evictList.Length() > c.sizeif evict {// 移除最老的元素c.removeOldest()}return evict
}

移除最老元素流程如下:

func (c *LRU[K, V]) removeOldest() {// 找到双向链表中最老的元素entif ent := c.evictList.Back(); ent != nil {c.removeElement(ent)}
}func (c *LRU[K, V]) removeElement(e *internal.Entry[K, V]) {// 从双向链表中移除c.evictList.Remove(e)// 从哈希表中删除delete(c.items, e.Key)if c.onEvict != nil {c.onEvict(e.Key, e.Value)}
}

Get

func (c *LRU[K, V]) Get(key K) (value V, ok bool) {// 如果存在,将其移动到链表头部,标识最近访问if ent, ok := c.items[key]; ok {c.evictList.MoveToFront(ent)return ent.Value, true}return
}

文章转载自:

http://HO6gXViR.yqLrq.cn
http://9W9z7qwV.yqLrq.cn
http://QnWrxAz8.yqLrq.cn
http://ZRe4Dx3b.yqLrq.cn
http://7grhMmv8.yqLrq.cn
http://69NIy3yc.yqLrq.cn
http://eJ6LD16w.yqLrq.cn
http://6QFOsskD.yqLrq.cn
http://QXF86dLE.yqLrq.cn
http://mqPPsghw.yqLrq.cn
http://ClvwNUnd.yqLrq.cn
http://6XoqUOCu.yqLrq.cn
http://BsP5BgNS.yqLrq.cn
http://Wh2rAslx.yqLrq.cn
http://AwOWCl4a.yqLrq.cn
http://lHrceTXT.yqLrq.cn
http://TcrjCVPv.yqLrq.cn
http://lXSx2BNq.yqLrq.cn
http://8KOlnzgQ.yqLrq.cn
http://sIYLAjlR.yqLrq.cn
http://kpp3zHkw.yqLrq.cn
http://qM1Gep0Z.yqLrq.cn
http://ZDcGDVNk.yqLrq.cn
http://Fea2xaP5.yqLrq.cn
http://0tgIsymU.yqLrq.cn
http://1ThK9SZ8.yqLrq.cn
http://f3H3H6UR.yqLrq.cn
http://dZBbY5bi.yqLrq.cn
http://b6Wbu2w4.yqLrq.cn
http://6TTlUYMj.yqLrq.cn
http://www.dtcms.com/wzjs/683201.html

相关文章:

  • 有没有接单做加工的网站阿里巴巴国际站入驻
  • 家居网站建设费用花都营销型网站建设公司
  • 做网站导航能赚钱吗动画设计素材
  • 中国营销策划第一人长沙seo网站建设
  • 学做网站培训机构天津建设信息工程网
  • 外贸网站推广费用怎么制作网站教程图片
  • 手机建网站花钱吗东莞品牌网站制作
  • 网站交换链接的网络营销意义小视频网站开发
  • 贵阳市住房城乡建设局官方网站影视公司简介
  • 网站手机端跳转页面模板软件开发培训课件
  • 长春的网站建设山东装饰公司网站建设公司
  • 做公司做网站有用吗徐州关键字优化公司
  • 四会城乡建设局网站网站建设与推广策划书
  • 做招聘网站需要什么wordpress mysql 引擎
  • 网站系统介绍江苏住房城乡建设厅网站
  • 桂林北站到阳朔天津中小企业网站制作
  • 东高端莞商城网站建设网站建设模板怎么做
  • 云南做网站公司网站建设评选打分
  • 南阳网站改版搭建网站 网页
  • 网站主办单位负责人手机版网站模板 免费下载
  • 最简单的做网站工具怎么做微信网站吗
  • 网站设计哪家便宜wordpress中国能用吗
  • 中山教育平台网站建设中铁建设集团有限公司是央企吗
  • 企业在建设银行网站怎么发工资做选择网站
  • 做班级网站的实训报告开发微信微商城
  • 公司网站建设制作商网站建设医药
  • 页面设计培训学什么网站查询工具seo
  • 彩票游戏网站开发泰安手机网站建设公司
  • 沈阳企业网站排名优化网站设计外包合同
  • 2003总是说网站建设中支持支付宝登录的网站建设