当前位置:首页 > PHP

php 实现lru

2026-03-12 18:26:05PHP

PHP 实现 LRU 缓存算法

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

php 实现lru

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

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

php 实现lru

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

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

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

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记住密码怎么实现

使用Cookie实现记住密码功能 在PHP中,可以通过设置Cookie来记住用户的登录状态。以下是一个简单的实现方式: // 用户登录验证成功后 if ($login_success) {…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php实现登陆

php实现登陆

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

php实现过程

php实现过程

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

php实现文章

php实现文章

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