数组实现LRU缓存淘汰策略

LRU简介

LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

过程思考

我的思路是这样的:我们维护一个数组,越靠近数组尾部的结点是越早之前访问的。当有一个新的数据被访问时,我们遍历数据
1.如果此数据之前已经被缓存在数组中了,我们遍历得到这个数据,返回成功,并将其从原来的位置删除,然后再插入到数组的头部。
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())
}

猜你喜欢

转载自blog.csdn.net/csdniter/article/details/112554930