PHP实现LRU算法的原理详解
什么是LRU算法
LRU(Least Recently Used)是一种缓存算法,它的过期规则是:缓存空间满时,优先淘汰最近最少使用的缓存数据。即在一段时间内,如果某个数据没有被访问到,那么接下来它被访问到的几率也很小,就可以被淘汰掉。可以理解为"长时间不用的东西,就扔掉"。
LRU算法原理
LRU算法可以通过哈希表和双向链表实现,它的核心思想是:将所有缓存数据按照访问的时间顺序排列,并保证每个数据的操作时间戳都不相同。当缓存满时,将最早访问的数据删除。
实现LRU算法需要使用一个哈希表和一个双向链表。哈希表存储缓存数据,双向链表存储缓存数据的访问时间顺序。当新数据加入缓存时,如果哈希表中已有该数据,则将该数据删除并重新添加到链表的头部;如果哈希表中没有该数据,则将该数据添加到链表的头部,并在哈希表中进行记录。当缓存数据满时,需要删除双向链表中最后一个节点,并在哈希表中删除对应的数据。
PHP实现LRU算法示例1
class LRUCache {
private $capacity;
private $hashMap = [];
private $list = null;
function __construct($capacity) {
$this->capacity = $capacity;
$this->list = new SplLinkedList();
}
public function get($key) {
if (isset($this->hashMap[$key])) {
$node = $this->hashMap[$key];
$this->list->detach($node);
$this->list->addFirst($node);
return $node->getValue();
} else {
return -1;
}
}
public function put($key, $value) {
if (isset($this->hashMap[$key])) {
$node = $this->hashMap[$key];
$this->list->detach($node);
} else {
if ($this->list->count() >= $this->capacity) {
$node = $this->list->getLast();
$this->list->detach($node);
unset($this->hashMap[$node->getKey()]);
}
$node = new SplDoublyLinkedListNode(compact('key', 'value'));
$this->hashMap[$key] = $node;
}
$this->list->addFirst($node);
}
}
以上示例中,我们使用了SplLinkedList
和SplDoublyLinkedListNode
来实现LRU算法。这两个类都是PHP内置的双向链表相关的类。双向链表的特点是可以从前往后遍历,也可以从后往前遍历。每次对节点的操作时间复杂度都是O(1)级别。因此,我们选择这两个类来实现LRU算法。
PHP实现LRU算法示例2
class LRUCache {
private $capacity;
private $map = [];
private $queue = [];
function __construct($capacity) {
$this->capacity = $capacity;
}
public function get($key) {
if (!isset($this->map[$key])) {
return -1;
}
$value = $this->map[$key];
array_splice($this->queue, array_search($key, $this->queue), 1);
array_unshift($this->queue, $key);
return $value;
}
public function put($key, $value) {
if (isset($this->map[$key])) {
array_splice($this->queue, array_search($key, $this->queue), 1);
} else {
if (count($this->queue) == $this->capacity) {
$k = array_pop($this->queue);
unset($this->map[$k]);
}
$this->map[$key] = $value;
}
array_unshift($this->queue, $key);
}
}
以上示例中,我们使用PHP数组和相关函数来实现LRU算法。当有新的数据需要添加到缓存中时,我们先判断缓存是否已经满了。如果满了,需要将最近最少使用的数据删除。我们使用array_pop()
函数获取数组最后一个元素,并使用unset()
函数从缓存中删除对应的数据。如果缓存没有满,直接在缓存中添加数据。每次添加或者访问缓存中的数据时,我们可以使用array_search()
函数来搜索相应的数据,在数组中将其移到最前面。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现LRU算法的原理详解 - Python技术站