LRUの概要
LRUキャッシュ除去アルゴリズムは一般的な戦略です。LRUのフルネームは「最近使用されていない」です。つまり、最近使用されたデータは「有用」である必要があります。長期間使用されていないデータは役に立たないはずです。メモリがいっぱいになると、長期間使用されていないデータを削除します。
プロセス思考
私の考えはこれです:私たちは配列を維持し、配列の終わりに近いノードはより早くアクセスされます。新しいデータにアクセスすると、データ
1をトラバースします。以前にデータが配列にキャッシュされている場合は、トラバースしてデータを取得し、成功を返し、元の位置から削除してから、配列のヘッドに挿入します。
2.データが配列にキャッシュされていない場合、次の2つの状況に分けることができます。
- この時点でキャッシュがいっぱいでない場合は、このデータを配列の先頭に直接挿入します。
- この時点でバッファがいっぱいの場合は、配列の最後のデータを削除し、新しいデータノードを配列の先頭に挿入します。
成し遂げる
// LRUを達成するためのアレイ、全体的な効率は高くありません。ここでは主に、除去戦略が何を行っているかを知るためです
package main
import "fmt"
type cache struct {
arr []int
MaxLen int //缓存的最大元素个数
}
func (c *cache)Get(value int) {
var flag bool
for i,v:=range c.arr{
if v==value{
flag=true
//数据在第一个
if i==0{
return
}else {
c.arr[i],c.arr[0]=c.arr[0],c.arr[i]
}
}
}
if !flag{
//当前元素不在缓存中
if c.Length()<c.MaxLen {
//不用淘汰,在头部添加即可
c.Add(value)
}else {
// 去掉最后一个元素,然后将新元素添加到头部
c.arr=c.arr[:c.Length()-1]
c.Add(value)
}
}
}
//在头部添加一个元素
func (c *cache)Add(value int) {
if c.MaxLen<c.MaxLen {
return
}
c.arr = append(c.arr[:0], append([]int{
value}, c.arr[0:]...)...)
}
// 获取当前缓存有哪些元素
func (c *cache)ShowData()[]int {
return c.arr
}
func (c *cache)Append(value int) {
if c.Length()>=c.MaxLen {
return
}
c.arr=append(c.arr,value)
}
func (c *cache)Length() int {
return len(c.arr)
}
func NewCache(max int)*cache {
res:=&cache{
MaxLen:max,
}
return res
}
func main() {
cacheDome:=NewCache(3)
cacheDome.Append(1)
cacheDome.Append(2)
cacheDome.Append(3)
fmt.Println(cacheDome.ShowData())
cacheDome.Append(4)
fmt.Println(cacheDome.ShowData())
cacheDome.Get(4)
fmt.Println(cacheDome.ShowData())
cacheDome.Get(5)
fmt.Println(cacheDome.ShowData())
}