当前位置:首页 > PHP

php实现lru

2026-02-14 16:25:01PHP

LRU缓存实现原理

LRU(Least Recently Used)缓存淘汰算法会优先移除最久未被使用的数据。PHP实现通常需要结合哈希表和双向链表,哈希表保证O(1)的查询速度,双向链表维护访问顺序。

双向链表节点类

定义链表节点结构,包含key、value以及前后指针:

class ListNode {
    public $key;
    public $value;
    public $prev;
    public $next;

    public function __construct($key, $value) {
        $this->key = $key;
        $this->value = $value;
    }
}

LRU缓存类结构

初始化缓存容量、哈希表和虚拟头尾节点:

class LRUCache {
    private $capacity;
    private $hashmap = [];
    private $dummyHead;
    private $dummyTail;

    public function __construct($capacity) {
        $this->capacity = $capacity;
        $this->dummyHead = new ListNode(null, null);
        $this->dummyTail = new ListNode(null, null);
        $this->dummyHead->next = $this->dummyTail;
        $this->dummyTail->prev = $this->dummyHead;
    }
}

链表操作辅助方法

添加节点到链表头部:

php实现lru

private function addToHead($node) {
    $node->next = $this->dummyHead->next;
    $node->prev = $this->dummyHead;
    $this->dummyHead->next->prev = $node;
    $this->dummyHead->next = $node;
}

移除指定节点:

private function removeNode($node) {
    $node->prev->next = $node->next;
    $node->next->prev = $node->prev;
}

移动节点到头部:

php实现lru

private function moveToHead($node) {
    $this->removeNode($node);
    $this->addToHead($node);
}

移除尾部节点:

private function removeTail() {
    $node = $this->dummyTail->prev;
    $this->removeNode($node);
    return $node;
}

核心缓存操作方法

获取缓存值:

public function get($key) {
    if (!isset($this->hashmap[$key])) {
        return -1;
    }
    $node = $this->hashmap[$key];
    $this->moveToHead($node);
    return $node->value;
}

写入缓存值:

public function put($key, $value) {
    if (isset($this->hashmap[$key])) {
        $node = $this->hashmap[$key];
        $node->value = $value;
        $this->moveToHead($node);
    } else {
        $node = new ListNode($key, $value);
        $this->hashmap[$key] = $node;
        $this->addToHead($node);

        if (count($this->hashmap) > $this->capacity) {
            $removed = $this->removeTail();
            unset($this->hashmap[$removed->key]);
        }
    }
}

使用示例

$cache = new LRUCache(2);
$cache->put(1, 1);
$cache->put(2, 2);
echo $cache->get(1);    // 返回 1
$cache->put(3, 3);      // 淘汰 key 2
echo $cache->get(2);    // 返回 -1

性能优化建议

对于PHP7+环境,可以使用SplDoublyLinkedList替代自定义链表实现。实际生产环境中建议使用Redis等专业缓存服务,其内置LRU淘汰策略且支持分布式。

标签: phplru
分享给朋友:

相关文章

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE o…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 &l…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…