当前位置:首页 > PHP

php 实现lru

2026-03-12 18:26:05PHP

PHP 实现 LRU 缓存算法

LRU(Least Recently Used)是一种常用的缓存淘汰策略,优先淘汰最近最少使用的数据。以下是 PHP 实现 LRU 的两种常见方法:

方法一:使用数组和哈希表结合

通过数组维护访问顺序,哈希表存储键值对,实现 O(1) 时间复杂度的访问和插入。

class LRUCache {
    private $capacity;
    private $cache = [];
    private $order = [];

    public function __construct($capacity) {
        $this->capacity = $capacity;
    }

    public function get($key) {
        if (!isset($this->cache[$key])) {
            return -1;
        }
        // 更新访问顺序
        unset($this->order[array_search($key, $this->order)]);
        array_push($this->order, $key);
        return $this->cache[$key];
    }

    public function put($key, $value) {
        if (isset($this->cache[$key])) {
            unset($this->order[array_search($key, $this->order)]);
        } elseif (count($this->cache) >= $this->capacity) {
            // 淘汰最久未使用的元素
            $lruKey = array_shift($this->order);
            unset($this->cache[$lruKey]);
        }
        $this->cache[$key] = $value;
        array_push($this->order, $key);
    }
}

方法二:使用双向链表和哈希表

通过双向链表维护访问顺序,哈希表存储节点引用,实现更高效的节点移动操作。

php 实现lru

class ListNode {
    public $key;
    public $val;
    public $prev;
    public $next;
    public function __construct($key, $val) {
        $this->key = $key;
        $this->val = $val;
    }
}

class LRUCache {
    private $capacity;
    private $map = [];
    private $head;
    private $tail;

    public function __construct($capacity) {
        $this->capacity = $capacity;
        $this->head = new ListNode(-1, -1);
        $this->tail = new ListNode(-1, -1);
        $this->head->next = $this->tail;
        $this->tail->prev = $this->head;
    }

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

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

    public function get($key) {
        if (!isset($this->map[$key])) {
            return -1;
        }
        $node = $this->map[$key];
        $this->removeNode($node);
        $this->addToHead($node);
        return $node->val;
    }

    public function put($key, $value) {
        if (isset($this->map[$key])) {
            $node = $this->map[$key];
            $node->val = $value;
            $this->removeNode($node);
            $this->addToHead($node);
        } else {
            if (count($this->map) >= $this->capacity) {
                $last = $this->tail->prev;
                $this->removeNode($last);
                unset($this->map[$last->key]);
            }
            $newNode = new ListNode($key, $value);
            $this->map[$key] = $newNode;
            $this->addToHead($newNode);
        }
    }
}

使用示例

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

注意事项

  • 方法一的数组操作在大量数据时性能较低,因为 array_searcharray_shift 是 O(n) 操作。
  • 方法二的双向链表实现更高效,所有操作均为 O(1) 时间复杂度。
  • 实际应用中可根据场景选择合适实现,小型缓存使用方法一更简单,高性能场景推荐方法二。

标签: phplru
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…

php 购物车实现session

php 购物车实现session

PHP 购物车实现(基于 Session) 在 PHP 中,使用 Session 实现购物车功能是一种常见方法。Session 可以跨页面存储用户数据,适合临时保存购物车信息。 初始化 Sessio…