当前位置:首页 > PHP

php实现lru

2026-01-29 18:29:01PHP

PHP实现LRU缓存算法

LRU(Least Recently Used)是一种常见的缓存淘汰策略,核心思想是当缓存空间不足时优先移除最近最少使用的数据。以下是PHP实现LRU缓存的两种典型方式:

双向链表+哈希表实现

使用双向链表维护访问顺序,哈希表实现快速查找,时间复杂度O(1):

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

    function __construct($capacity) {
        $this->capacity = $capacity;
        $this->head = new Node(0, 0);
        $this->tail = new Node(0, 0);
        $this->head->next = $this->tail;
        $this->tail->prev = $this->head;
    }

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

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

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

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

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

使用PHP内置数组模拟

简化版实现,利用array_keys()维护访问顺序:

class SimpleLRU {
    private $capacity;
    private $cache = [];

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

    public function get($key) {
        if (!isset($this->cache[$key])) return null;
        $value = $this->cache[$key];
        unset($this->cache[$key]);
        $this->cache[$key] = $value; // 移动到"最近使用"位置
        return $value;
    }

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

实际应用建议

生产环境推荐使用成熟的缓存库:

php实现lru

  1. 直接使用Redis等内存数据库的LRU功能
  2. 采用Symfony Cache或Laravel Cache组件
  3. 考虑使用SplObjectStorage等SPL数据结构优化性能

性能关键场景应选择双向链表实现,简单场景可用数组简化版。注意PHP数组的"最近使用"特性实际上是通过哈希表实现的,严格来说并非标准LRU。

标签: phplru
分享给朋友:

相关文章

php 实现自动收货

php 实现自动收货

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

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php实现登陆

php实现登陆

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