怎么用Go语言实现LRU Cache
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,小编给大家分享一下怎么用Go语言实现LRU Cache,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!1 基本概念LRU是一个老生常谈的问题,即最近最少使用,LRU是Least Rec
千家信息网最后更新 2025年02月04日怎么用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安全错误
数据库的锁怎样保障安全
youtube服务器
陌生交友类app软件开发
网络安全公益广告获奖
邮政成本数据库
软件开发团队突破技术瓶颈
网络管理储存服务器
2d视觉系统利用软件开发
数据库报警系统
台州软件开发者
kt独立服务器
宽带网络安全密钥修改
达梦数据库给表加字段
如何加强内部网络安全
软件开发服务税率多少
高级数据库技术华东理工大学
带数据库的学生管理系统
不可重复读违法数据库
pdb数据库的格式
京医通服务器卡顿
ftp服务器地址不正确
镁光服务器内存保修
服务器上网插件
软件开发疑难问题
太原网络安全宣传周在即
崇明区项目网络技术代理商
网络安全公约怎么写
数据库员工工资管理系统索引
湖南实用的外贸软件开发公司
网络安全与维护的论文
数据库简单的数据字典