lru算法实现-php数组

一世执手 提交于 2020-03-10 15:49:53
//php实现lru算法缓存 LRU:最近最少使用策略LRU(Least Recently Used)
//思路分析: 越靠近头部为新数据或者最新访问的数据
class AlgLruCache
{
    private $lruData;
    private $capacity; //容量
    private $length; //数据大小

    public function __construct($capacity)
    {
        $this->capacity = intval($capacity);
        $this->lruData = [];
        $this->length = 0;
    }

    public function getValue()
    {
        return $this->lruData;
    }

    public function setValue($v)
    {
        //已存在 移动到头部
        if (in_array($v, $this->lruData)) {
            $this->delVal($v);
            $this->inserHead($v);

            return true;
        }

        //已满
        if ($this->checkIsFull()) {
            $this->delEndVal();;
        }

        $this->inserHead($v);
        return true;
    }

    //数组是否已满
    protected function checkIsFull()
    {
        if ($this->length == $this->capacity) {
            return true;
        }

        return false;
    }

    private function inserHead($v)
    {
        array_unshift($this->lruData, $v);
        $this->length++;
    }

    //删除已存在
    private function delVal($val)
    {
        foreach ($this->lruData as $k => $v) {
            if ($v == $val) {
                unset($this->lruData[$k]);
                break;
            }
        }
        $this->length--;
    }

    //删除尾部
    private function delEndVal()
    {
        array_pop($this->lruData);
    }
}

$algLru = new AlgLruCache(3);
$algLru->setValue('cache1');
$algLru->setValue('cache2');
$algLru->setValue('cache3');

$algLru->setValue('cache2');
$algLru->setValue('cache8');
var_dump($algLru->getValue());
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!