//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());
来源:oschina
链接:https://my.oschina.net/hackdebug/blog/3191028