亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

如何利用Go語言實現(xiàn)LRU?Cache

 更新時間:2022年03月16日 17:27:49   作者:紅帽海綿寶寶  
這篇文章主要介紹了如何利用Go語言實現(xiàn)LRU?Cache,LRU是Least?Recently?Used的縮寫,是一種操作系統(tǒng)中常用的頁面置換算法,下面我們一起進入文章了解更多內容吧,需要的朋友可以參考一下

1 基本概念

LRU是一個老生常談的問題,即最近最少使用,LRU是Least Recently Used的縮寫,是一種操作系統(tǒng)中常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現(xiàn)有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。

實現(xiàn)LRU基本的數(shù)據(jù)結構Map+LinkedList

一般規(guī)則:

  • 添加數(shù)據(jù)時,將新增數(shù)據(jù)節(jié)點放在頭指針,尾結點部分大于最大長度時刪除。
  • 刪除數(shù)據(jù)時,先按照Map的規(guī)則進行查找,再根據(jù)鏈表規(guī)則進行刪除。
  • 查找數(shù)據(jù)時,按照Map進行查找,沒有則返回空,有則返回該數(shù)據(jù)的值并移動到頭節(jié)點。

2 代碼實現(xiàn)

package main
import "fmt"

var head *Node
var end *Node

type 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語言實現(xiàn)LRU Cache的文章就介紹到這了,更多相關Go實現(xiàn)LRU Cache內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 在Go中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在Go中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng)

    在當今互聯(lián)網應用的架構中,分布式系統(tǒng)已經成為主流,分布式系統(tǒng)的優(yōu)勢在于能夠提供高可用性、高并發(fā)性和可擴展性,本文將介紹鏈路追蹤的概念和原理,并重點介紹如何在Golang中實現(xiàn)高效可靠的鏈路追蹤系統(tǒng),需要的朋友可以參考下
    2023-10-10
  • Go語言入門之基礎語法和常用特性解析

    Go語言入門之基礎語法和常用特性解析

    這篇文章主要給大家講解了Go語言的基礎語法和常用特性解析,比較適合入門小白,文中通過代碼示例介紹的非常詳細,對我們學習Go語言有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • go日志系統(tǒng)logrus顯示文件和行號的操作

    go日志系統(tǒng)logrus顯示文件和行號的操作

    這篇文章主要介紹了go日志系統(tǒng)logrus顯示文件和行號的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • Go Web 編程中的模板庫應用指南(超詳細)

    Go Web 編程中的模板庫應用指南(超詳細)

    這篇文章主要介紹了Go Web 編程中的模板庫應用指南,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • logrus hook輸出日志到本地磁盤的操作

    logrus hook輸出日志到本地磁盤的操作

    這篇文章主要介紹了logrus hook輸出日志到本地磁盤的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • golang調用shell命令(實時輸出,終止)

    golang調用shell命令(實時輸出,終止)

    本文主要介紹了golang調用shell命令(實時輸出,終止),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • K8s部署發(fā)布Golang應用程序的實現(xiàn)方法

    K8s部署發(fā)布Golang應用程序的實現(xiàn)方法

    本文主要介紹了K8s部署發(fā)布Golang應用程序的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2021-07-07
  • 基于Golang實現(xiàn)Excel表格的導入導出功能

    基于Golang實現(xiàn)Excel表格的導入導出功能

    最近項目開發(fā)中有涉及到Excel的導入與導出功能,特別是導出表格時需要特定的格式,所以本文給大家介紹了基于Golang實現(xiàn)Excel表格的導入導出功能,文中通過代碼示例和圖文介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 基于Go語言實現(xiàn)簡單的計算器

    基于Go語言實現(xiàn)簡單的計算器

    這篇文章主要為大家詳細介紹了如何基于Go語言實現(xiàn)簡單的計算器,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-10-10
  • Go語言中init函數(shù)特點、用途和注意事項詳解

    Go語言中init函數(shù)特點、用途和注意事項詳解

    go語言中有一個非常神奇的函數(shù)init,它可以在所有程序執(zhí)行開始前被執(zhí)行,并且每個package下面可以存在多個init函數(shù),這篇文章主要給大家介紹了關于Go語言中init函數(shù)特點、用途和注意事項的相關資料,需要的朋友可以參考下
    2023-07-07

最新評論