当前位置:首页 > PHP

lru php实现

2026-01-29 23:01:18PHP

PHP实现LRU缓存算法

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

lru php实现

使用双向链表+哈希表实现

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

    function __construct($capacity) {
        $this->capacity = $capacity;
        $this->head = new Node(null, null);
        $this->tail = new Node(null, null);
        $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 {
            if (count($this->map) >= $this->capacity) {
                $last = $this->tail->prev;
                $this->removeNode($last);
                unset($this->map[$last->key]);
            }
            $node = new Node($key, $value);
            $this->map[$key] = $node;
            $this->addToHead($node);
        }
    }

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

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

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

使用PHP内置数据结构实现

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

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

    public function get($key) {
        if (!isset($this->cache[$key])) {
            return null;
        }

        // 更新访问顺序
        $index = array_search($key, $this->order);
        unset($this->order[$index]);
        array_unshift($this->order, $key);

        return $this->cache[$key];
    }

    public function put($key, $value) {
        if (isset($this->cache[$key])) {
            // 更新现有值
            $this->cache[$key] = $value;
            $index = array_search($key, $this->order);
            unset($this->order[$index]);
        } else {
            // 检查容量
            if (count($this->cache) >= $this->capacity) {
                $oldest = array_pop($this->order);
                unset($this->cache[$oldest]);
            }
            $this->cache[$key] = $value;
        }
        array_unshift($this->order, $key);
    }
}

实现要点

双向链表实现方式时间复杂度为O(1),适合高性能场景。使用哈希表存储节点引用,双向链表维护访问顺序。

lru php实现

简单实现方式利用PHP数组特性,代码更简洁但性能稍差,array_search操作时间复杂度为O(n)。

实际应用中可根据需求选择:

  • 高频访问场景建议使用双向链表实现
  • 简单业务场景可使用数组实现
  • 生产环境建议考虑成熟的缓存库如Redis

标签: lruphp
分享给朋友:

相关文章

php记住密码怎么实现

php记住密码怎么实现

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

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现的进度条

php实现的进度条

PHP 实现的进度条方法 在 PHP 中实现进度条通常可以通过命令行脚本(CLI)或 Web 页面两种方式完成。以下是几种常见的实现方法: 命令行进度条 使用 PHP CLI 实现进度条,可以通过不…

php数组实现

php数组实现

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