一、什么是LRU

LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。

二、代码解析

iru/iru.go

type Cache struct {//缓存中最多存储的条数,当MaxEntries为0时没有限制MaxEntries int//销毁前回调OnEvicted func(key Key, value interface{})//链表ll    *list.List//key为任意类型,值为指向链表结点的指针cache map[interface{}]*list.Element
}type Key interface{}//访问入口结构
type entry struct {key   Keyvalue interface{}
}
//初始化一个cache
func New(maxEntries int) *Cache {return &Cache{MaxEntries: maxEntries,ll:         list.New(),  //list.New() 初始化链表cache:      make(map[interface{}]*list.Element),}
}
//向cache中添加一个value
func (c *Cache) Add(key Key, value interface{}) {if c.cache == nil {    //如果cache没有初始化先初始化cache和l1c.cache = make(map[interface{}]*list.Element)c.ll = list.New()}if ee, ok := c.cache[key]; ok {  //如果key存在将记录移到链表头部,然后将值设置为value(保证最近访问的在最前面)c.ll.MoveToFront(ee)   //MoveToFront(e) 中e不能为空ee.Value.(*entry).value = valuereturn}//如果key不存在,创建一条记录,插入到链表头部,ele := c.ll.PushFront(&entry{key, value})  // PushFront(v interface{})返回的是*Element ,作用是在链表头部插入一个值为v的新元素//cache这个map设置key为Key类型的key,value为*list.Element类型的elec.cache[key] = ele//链表长度超过最大值,就会出发清理操作if c.MaxEntries != 0 && c.ll.Len() > c.MaxEntries {c.RemoveOldest()}
}
//根据传入的key查询value
func (c *Cache) Get(key Key) (value interface{}, ok bool) {if c.cache == nil {return}//如果存在,将ele移到链表头部,返回entry的值if ele, hit := c.cache[key]; hit {c.ll.MoveToFront(ele)return ele.Value.(*entry).value, true}return
}
//如果key存在,调用removeElement删除链表和缓存中的元素
func (c *Cache) Remove(key Key) {if c.cache == nil {return}if ele, hit := c.cache[key]; hit {c.removeElement(ele)}
}
//移除最久未被访问的元素
func (c *Cache) RemoveOldest() {if c.cache == nil {return}ele := c.ll.Back()  //Back()返回链表最后一个元素,如果为空返回nilif ele != nil {c.removeElement(ele)}
}
//
func (c *Cache) removeElement(e *list.Element) {c.ll.Remove(e)   // Remove(e) 从链表中移除e返回e.Value// Value本身是interface{}类型,通过类型断言转成*entry类型kv := e.Value.(*entry)// 删除cache这个map中key为kv.key这个元素;也就是链表中删了之后缓存中也得删delete(c.cache, kv.key)//这里如果回调函数不为空,要执行一下回调函数if c.OnEvicted != nil {c.OnEvicted(kv.key, kv.value)}
}
//返回缓存中缓存的数量,通过Len()获取
func (c *Cache) Len() int {if c.cache == nil {return 0}return c.ll.Len()
}
//删除缓存中所有条目,如果有回调函数OnEvicted(),则先调用所有回调函数,然后置空
func (c *Cache) Clear() {if c.OnEvicted != nil {for _, e := range c.cache {kv := e.Value.(*entry)c.OnEvicted(kv.key, kv.value)}}c.ll = nilc.cache = nil
}

groupcache源码解析(IRU)相关推荐

  1. 谷歌BERT预训练源码解析(二):模型构建

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/weixin_39470744/arti ...

  2. 谷歌BERT预训练源码解析(三):训练过程

    目录 前言 源码解析 主函数 自定义模型 遮蔽词预测 下一句预测 规范化数据集 前言 本部分介绍BERT训练过程,BERT模型训练过程是在自己的TPU上进行的,这部分我没做过研究所以不做深入探讨.BE ...

  3. 谷歌BERT预训练源码解析(一):训练数据生成

    目录 预训练源码结构简介 输入输出 源码解析 参数 主函数 创建训练实例 下一句预测&实例生成 随机遮蔽 输出 结果一览 预训练源码结构简介 关于BERT,简单来说,它是一个基于Transfo ...

  4. Gin源码解析和例子——中间件(middleware)

    在<Gin源码解析和例子--路由>一文中,我们已经初识中间件.本文将继续探讨这个技术.(转载请指明出于breaksoftware的csdn博客) Gin的中间件,本质是一个匿名回调函数.这 ...

  5. Colly源码解析——结合例子分析底层实现

    通过<Colly源码解析--框架>分析,我们可以知道Colly执行的主要流程.本文将结合http://go-colly.org上的例子分析一些高级设置的底层实现.(转载请指明出于break ...

  6. libev源码解析——定时器监视器和组织形式

    我们先看下定时器监视器的数据结构.(转载请指明出于breaksoftware的csdn博客) /* invoked after a specific time, repeatable (based o ...

  7. libev源码解析——定时器原理

    本文将回答<libev源码解析--I/O模型>中抛出的两个问题.(转载请指明出于breaksoftware的csdn博客) 对于问题1:为什么backend_poll函数需要指定超时?我们 ...

  8. libev源码解析——I/O模型

    在<libev源码解析--总览>一文中,我们介绍过,libev是一个基于事件的循环库.本文将介绍其和事件及循环之间的关系.(转载请指明出于breaksoftware的csdn博客) 目前i ...

  9. libev源码解析——调度策略

    在<libev源码解析--监视器(watcher)结构和组织形式>中介绍过,监视器分为[2,-2]区间5个等级的优先级.等级为2的监视器最高优,然后依次递减.不区分监视器类型和关联的文件描 ...

最新文章

  1. C指针3:指针变量的运算
  2. 悟道·文汇详解:少样本学习等近十个数据集取得第一
  3. SpringBoot 2.0 编程方式配置,不使用默认配置方式
  4. uva111346Probability
  5. MVC2验证(自定义异常)
  6. Python面试题总结(4)--数据类型(列表)
  7. Thinkphp5.0内核仿阿里巴巴小说双端网站源码
  8. python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】
  9. 域迁移过程下详细步骤
  10. 如何通过http协议知道是从那个站点过来的请求_聊聊HTTP的那些事,以及在它背后的“勾当”...
  11. 汽车维保反欺诈系统的设计和算法应用
  12. 如何更改通达OA附件的存储目录
  13. 基于MTCNN+CNN的疲劳检测
  14. 由浅入深理解JVM垃圾回收机制
  15. 如何使用 IT 服务台调查来提高满意度
  16. 架设游戏私服——内网穿透工具frp
  17. ue4Make Rot From x
  18. 【COCI 2011】送票
  19. 想要下载的编程软件太难找?部分软件官网介绍
  20. IoU优化——在Anchor-Free中提升目标检测精度(附源码)

热门文章

  1. 南宁计算机专业学校排名,学校排名
  2. JavaScript shells
  3. uva 672 Gangsters
  4. 养生常识 淘米水14个妙用一般人不知道
  5. 解决搜狗输入法总是自动切换皮肤
  6. 大数据阶段项目之项目介绍
  7. matlab中S-function的概念及使用
  8. 转让测绘资质,转让天津测绘资质
  9. 【转】国内手机上网站点大测试
  10. 噪音放大器原理及基础知识问答