怎么用Go语言实现LRU Cache
发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,小编给大家分享一下怎么用Go语言实现LRU Cache,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1 基本概念LRU是一个老生常谈的问题,即最近最少使用,LRU是Least Rec
千家信息网最后更新 2024年11月15日怎么用Go语言实现LRU Cache
小编给大家分享一下怎么用Go语言实现LRU Cache,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
1 基本概念
LRU是一个老生常谈的问题,即最近最少使用,LRU是Least Recently Used
的缩写,是一种操作系统中常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。
实现LRU基本的数据结构:Map+LinkedList
一般规则:
添加数据时,将新增数据节点放在头指针,尾结点部分大于最大长度时删除。
删除数据时,先按照Map的规则进行查找,再根据链表规则进行删除。
查找数据时,按照
Map
进行查找,没有则返回空,有则返回该数据的值并移动到头节点。
2 代码实现
package mainimport "fmt"var head *Nodevar end *Nodetype Node struct { Key string Value string pre *Node next *Node}func (n *Node) Init(key string, value string) { n.Key = key n.Value = value}type LRUCache struct { Capacity int //页面初始化大小 Size int //页面实际大小 Map map[string]*Node //具体的cache}func GetLRUCache(capacity int) *LRUCache { lruCache := LRUCache{Capacity: capacity} lruCache.Map = make(map[string]*Node, capacity) return &lruCache}func (l *LRUCache) get(key string) string { if v, ok := l.Map[key]; ok { l.refreshNode(v) return v.Value } else { return "null" }}func (l *LRUCache) put(key, value string) { if v, ok := l.Map[key]; !ok { if len(l.Map) >= l.Capacity { oldKey := l.removeNode(head) delete(l.Map, oldKey) } node := Node{Key: key, Value: value} l.addNode(&node) l.Map[key] = &node } else { v.Value = value l.refreshNode(v) }}func (l *LRUCache) refreshNode(node *Node) { if node == end { return } l.removeNode(node) l.addNode(node)}func (l *LRUCache) removeNode(node *Node) string { if node == end { end = end.pre } else if node == head { head = head.next } else { node.pre.next = node.next node.next.pre = node.pre } return node.Key}func (l *LRUCache) addNode(node *Node) { if end != nil { end.next = node node.pre = end node.next = nil } end = node if head == nil { head = node }}
3 测试使用
func main() { lruCache := GetLRUCache(3) lruCache.put("001", "1") lruCache.put("002", "2") lruCache.put("003", "3") lruCache.put("004", "4") lruCache.put("005", "5") lruCache.get("002") fmt.Println(lruCache.get("001")) fmt.Println(lruCache.get("002")) fmt.Print(lruCache.Map)}
看完了这篇文章,相信你对"怎么用Go语言实现LRU Cache"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!
页面
数据
规则
语言
最大
大小
算法
篇文章
节点
选择
老生常谈
操作系统
代码
字段
完了
实际
常用
指针
数据结构
时间
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
vr软件开发专业如何
医生做网络技术
数据中心服务器厂商
龙之国物语服务器互通吗
新华网络安全教育
软件开发方法和异同
git需要服务器吗
网络技术三级书
服务器电源atx和ssi区别
网络安全教育通讯
什么企业需要服务器托管和租用
赌博软件开发判刑
网络安全设备厂商介绍范文
网络安全云计算公式
数据库处理技术的发展历程
声光电法制体验馆软件开发
海南耀天网络技术有限公司开发的游戏
人人商城数据库没有怎么办
携号转网数据库连接申请
数据库锁机怎么处理
linux访问本地数据库
数据库的安全保护措施主要有
mysql 查看数据库
erp软件开发实例
山东省的网络技术公司地址
java软件开发公司排名
网络安全普及教育专题节目
创星互联网络科技有限公司
数据库字段去掉字符
汇丰银行软件开发中心