当前位置:首页 > 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;
    }
}

链表操作辅助方法

添加节点到链表头部:

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;
}

移动节点到头部:

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;
}

写入缓存值:

php实现lru

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 ord…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…

php数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…

php实现过程

php实现过程

PHP 实现过程 PHP 是一种广泛使用的服务器端脚本语言,特别适合 Web 开发。以下是 PHP 实现过程的关键步骤和注意事项。 安装与配置 下载并安装 PHP,可以从官方 PHP 网站获取最新版…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…