主页 > 知识库 > golang实现LRU缓存淘汰算法的示例代码

golang实现LRU缓存淘汰算法的示例代码

热门标签:中国地图标注省会高清 高德地图标注口诀 江西转化率高的羿智云外呼系统 西部云谷一期地图标注 地图标注的汽车标 南通如皋申请开通400电话 广州呼叫中心外呼系统 学海导航地图标注 浙江高速公路地图标注

LRU缓存淘汰算法

LRU是最近最少使用策略的缩写,是根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。

双向链表实现LRU

将Cache的所有位置都用双链表连接起来,当一个位置被访问(get/put)之后,通过调整链表的指向,将该位置调整到链表头的位置,新加入的Cache直接加到链表头中。

这样,在多次操作后,最近被访问(get/put)的,就会被向链表头方向移动,而没有访问的,向链表后方移动,链表尾则表示最近最少使用的Cache。

当达到缓存容量上限时,链表的最后位置就是最少被访问的Cache,我们只需要删除链表最后的Cache便可继续添加新的Cache。

代码实现

type Node struct {
  Key int
  Value int
  pre *Node
  next *Node
}

type LRUCache struct {
  limit int
  HashMap map[int]*Node
  head *Node
  end *Node
}

func Constructor(capacity int) LRUCache{
  lruCache := LRUCache{limit:capacity}
  lruCache.HashMap = make(map[int]*Node, capacity)
  return lruCache
}

func (l *LRUCache) Get(key int) int {
  if v,ok:= l.HashMap[key];ok {
    l.refreshNode(v)
    return v.Value
  }else {
    return -1
  }
}

func (l *LRUCache) Put(key int, value int) {
  if v,ok := l.HashMap[key];!ok{
    if len(l.HashMap) >= l.limit{
      oldKey := l.removeNode(l.head)
      delete(l.HashMap, oldKey)
    }
    node := Node{Key:key, Value:value}
    l.addNode(node)
    l.HashMap[key] = node
  }else {
    v.Value = value
    l.refreshNode(v)
  }
}

func (l *LRUCache) refreshNode(node *Node){
  if node == l.end {
    return
  }
  l.removeNode(node)
  l.addNode(node)
}

func (l *LRUCache) removeNode(node *Node) int{
  if node == l.end {
    l.end = l.end.pre
  }else if node == l.head {
    l.head = l.head.next
  }else {
    node.pre.next = node.next
    node.next.pre = node.pre
  }
  return node.Key
}

func (l *LRUCache) addNode(node *Node){
  if l.end != nil {
    l.end.next = node
    node.pre = l.end
    node.next = nil
  }
  l.end = node
  if l.head == nil {
    l.head = node
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
  • java LRU算法介绍与用法示例
  • 工程师必须了解的LRU缓存淘汰算法以及python实现过程
  • JS 实现缓存算法的示例(FIFO/LRU)
  • Nodejs基于LRU算法实现的缓存处理操作示例
  • c++实现的常见缓存算法和LRU
  • Android图片缓存之Lru算法(二)
  • Python实现LRU算法的2种方法
  • JAVA实现LRU算法的参考示例

标签:东营 吐鲁番 贵州 保定 德宏 许昌 曲靖 常州

巨人网络通讯声明:本文标题《golang实现LRU缓存淘汰算法的示例代码》,本文关键词  golang,实现,LRU,缓存,淘汰,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《golang实现LRU缓存淘汰算法的示例代码》相关的同类信息!
  • 本页收集关于golang实现LRU缓存淘汰算法的示例代码的相关信息资讯供网民参考!
  • 推荐文章