广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP如何实现LRU算法
  • 228
分享到

PHP如何实现LRU算法

2023-06-20 12:06:24 228人浏览 薄情痞子
摘要

小编给大家分享一下PHP如何实现LRU算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!整体设计用数组保存缓存对象(node);缓存对象(Node)之间通过nex

小编给大家分享一下PHP如何实现LRU算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

整体设计

数组保存缓存对象(node);

缓存对象(Node)之间通过nexTKEy,preKey组成一个双向链表;

保存链表头 跟尾;

处理流程如下图:

PHP如何实现LRU算法

主要代码

Node 节点类

class Node{    private $preKey=null;//链表前一个节点    private $nextKey=null;//链表后一个节点    private $value=null;//当前的值    private $key=null;//当前key    public function __construct(string  $key,$value)    {        $this->value=$value;        $this->key=$key;    }    public function setPreKey($preValue){        $this->preKey=$preValue;    }    public function setNextKey($nextValue){        $this->nextKey=$nextValue;    }    public function getPreKey(){        return $this->preKey;    }    public function getNextKey(){        return $this->nextKey;    }    public function getValue(){        return $this->value;    }    public function setValue($value){        $this->value=$value;    }    public function setKey(string  $key){        $this->key=$key;    }    public function getKey(){        return $this->key;    }}

缓存类

class LruCache{    public $cacheTable =[];    private $headNode=null;    private $lastNode=null;    private $cacheCount=0;    private $cacheMax=100;        public function dumpAllData(){        if (!empty($this->headNode)){            $node=$this->headNode;            while (!empty($node)){                echo 'key='.$node->getKey().'  nextKey='.(empty($node->getNextKey())?'null':$node->getNextKey()->getKey()).' preKey='.(empty($node->getPreKey())?'null':$node->getPreKey()->getKey()).' value='.$node->getValue()."</br>";                $node=$node->getNextKey();            }        }    }        public function setCacheMax(int $count){        $this->cacheMax=$count;    }        public function set(string $key,$value){        //设置值为null,则认为删除缓存节点        if ($value===null){            $this->del($key);            return true;        }        //判断是否存在表中,存在则更新连表        if (!empty($this->cacheTable[$key])){            $this->updateList($key);            return true;        }        //先判断是否要删除        $this->shiftNode();        $this->addNode($key,$value);        return true;    }        public function del(string $key){        if (!empty($this->cacheTable[$key])){            $node=&$this->cacheTable[$key];            //摘出节点            $this->jumpNode($node);            //置空删除            $node->setPreKey(null);            $node->setNextKey(null);            unset($this->cacheTable[$key]);            return true;        }        return false;    }        public function get(string $key){        if (!empty($this->cacheTable[$key])){            $this->updateList($key);            return $this->cacheTable[$key]->getValue();        }        return null;    }    //直接添加节点    private function addNode($key,$value){        $addNode=new Node($key,$value);        if (!empty($this->headNode)){            $this->headNode->setPreKey($addNode);        }        $addNode->setNextKey($this->headNode);        //第一次保存最后一个节点为头节点        if ($this->lastNode==null){            $this->lastNode=$addNode;        }        $this->headNode=$addNode;        $this->cacheTable[$key]=$addNode;        $this->cacheCount++;    }    //主动删超出的缓存    private function shiftNode(){        while ($this->cacheCount>=$this->cacheMax){            if (!empty($this->lastNode)){                if (!empty($this->lastNode->getPreKey())){                    $this->lastNode->getPreKey()->setNextKey(null);                }                $lastKey=$this->lastNode->getKey();                unset($this->cacheTable[$lastKey]);            }            $this->cacheCount--;        }    }    //更新节点链表    private function updateList($key){        //这里需要使用引用传值        $node=&$this->cacheTable[$key];        //当前结点为头结点 直接不用处理        if ($this->headNode===$node){            return true;        }        //摘出结点        $this->jumpNode($node);        //跟头结点交换        $node->setNextKey($this->headNode);        $this->headNode->setPreKey($node);        $node->setPreKey(null);        $this->headNode=$node;        return true;    }    //将某个节点摘出来    private function jumpNode(Node &$node){        if (!empty($node->getPreKey())){            $node->getPreKey()->setNextKey($node->getNextKey());        }        if (!empty($node->getNextKey())){            $node->getNextKey()->setPreKey($node->getPreKey());        }        //如果是最后一个节点,则更新最后节点为它的前节点        if ($node->getNextKey()==null){            $this->lastNode=$node->getPreKey();        }        //如果是头结点        if ($node->getPreKey()==null){            $this->headNode=$node->getNextKey();        }    }}

测试代码

    public function tt(){    $cath=model("LruCache");    $cath->setCacheMax(3);    $cath->set("aa","aaaaaaaaaaa");    $cath->set("bb","bbbbbbbbbbbb");    $cath->set("cc","ccccccccccccc");    $cath->get("aa");//        $cath->dumpAllData();        $cath->set("dd","DDDdddddddddd");//        $cath->del("cc");//        var_dump($cath->cacheTable);        $cath->dumpAllData();        exit();    }

以上是“php如何实现LRU算法”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网PHP编程频道!

--结束END--

本文标题: PHP如何实现LRU算法

本文链接: https://www.lsjlt.com/news/296622.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP如何实现LRU算法
    小编给大家分享一下PHP如何实现LRU算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!整体设计用数组保存缓存对象(Node);缓存对象(Node)之间通过nex...
    99+
    2023-06-20
  • LRU算法——python实现
    在LeetCode上看到这么一道题: Design and implement a data structure for Least Recently Used (LRU) cache. It should support the f...
    99+
    2023-01-31
    算法 LRU python
  • Python实现LRU算法
    在第一节中已经实现了双向链表DoubleLinkedList类,本节我们基于双向链表实现LRU(Least Recently Used最近最少使用)缓存置换算法。Redis的淘汰机制...
    99+
    2022-11-11
  • PHP实现LRU算法的原理详解
    1.概念 LRU : 最近最少使用算法 2.代码 <php class Node { public $preKey = null; //链表前一个节点 publ...
    99+
    2022-11-13
  • PHP实现LRU算法的示例代码
    本篇文章主要给大家介绍了PHP的相关知识,LRU是Least Recently Used 近期最少使用算法, 内存管理的一种页面置换算法,下面将详解LRU算法的原理以及实现,下面一起来看一下,希望对大家有帮助。(推荐教程:PHP视频教程)原...
    99+
    2022-08-08
    php
  • Redis如何实现LRU缓存淘汰算法
    小编给大家分享一下Redis如何实现LRU缓存淘汰算法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1 标准LRU的实现原理LR...
    99+
    2022-10-19
  • JavaScript如何实现LRU缓存淘汰算法
    目录如何实现LRU缓存淘汰算法使用哈希表和双向链表哈希表实现LRU缓存淘汰算法如何实现LRU缓存淘汰算法 LRU(Least Recently Used)缓存淘汰算法是一种常见的缓存...
    99+
    2023-05-17
    JavaScript LRU缓存淘汰算法 LRU缓存淘汰算法 JavaScript LRU
  • Java如何实现LRU缓存淘汰算法
    这篇文章主要介绍了Java如何实现LRU缓存淘汰算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。概述LRU 算法全称为 Least Recently Used 是一种常见的...
    99+
    2023-06-15
  • Redis如何使用LRU算法?
    1、设置Redis使用LRU算法LRU(Least Recently Used)最近最少使用算法是众多置换算法中的一种。 Redis中有一个maxmemory概念,主要是为了将使用的内存限定在一个固定的大小...
    99+
    2022-10-18
  • JavaScript实现LRU算法的示例详解
    目录LRU简介如何实现实现思路缺陷双向链表+哈希表双向链表实现思路不知道屏幕前的朋友们,有没有和我一样,觉得LRU算法原理很容易理解,实现起来却很复杂。 明明一个map就能解决,标准...
    99+
    2023-05-17
    JavaScript实现LRU算法 JavaScript LRU算法 JavaScript LRU
  • C++ 实现LRU 与 LFU 的缓存算法
    目录一、LRU (Least Recently Used) 缓存 二、LFU (Least Frequently Used) 缓存一、LRU (Least Recently Used...
    99+
    2022-11-12
  • java实现LRU缓存淘汰算法的方法
    LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的缓存(即使该缓存被访问的次数最多)。 如何实现LRU缓存淘汰算法 场景: ...
    99+
    2022-11-12
  • LRU缓存算法的实现方法是什么
    这篇文章主要讲解了“LRU缓存算法的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“LRU缓存算法的实现方法是什么”吧!LRU就是Least R...
    99+
    2022-10-19
  • 如何理解Oracle数据库LRU算法中的LRU链、脏块与脏LRU链
    如何理解Oracle数据库LRU算法中的LRU链、脏块与脏LRU链,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。概述所谓的LRU(Least ...
    99+
    2022-10-19
  • C语言实现页面置换算法(FIFO、LRU)
    目录1.实现效果2.实现源代码 1.实现效果 2.实现源代码  #include<iostream> #include<process.h> #inc...
    99+
    2022-11-12
  • Java实现FIFO、LRU、LFU、OPT页面置换算法
    目录题目要求具体代码题目要求 采用多道程序思想设计一个程序,模拟页存储管理地址变换的过程,可采用FIFO、LRU、LFU、OPT四页面置换算法。基本要求如下: 需要建立访问页表线程、...
    99+
    2023-02-07
    Java 页面置换算法 JAVA FIFO LRU LFU OPT
  • Redis的LRU缓存淘汰算法怎么实现
    本文小编为大家详细介绍“Redis的LRU缓存淘汰算法怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Redis的LRU缓存淘汰算法怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2022-10-19
  • Java实现LRU缓存算法的参考示例
    目录一、什么是 LRU二、Java 实现 LRU 缓存算法一、什么是 LRU LRU(Least Recently Used,最近最少使用)是...
    99+
    2023-05-20
    Java 算法 Java LRU缓存算法 Java LUR
  • Go语言如何实现LRU算法的核心思想和实现过程
    这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常见的三种缓存淘汰算法有三种:FIFO,LRU和LFU实现LRU缓存淘汰算法1....
    99+
    2023-07-06
  • Java实现常用缓存淘汰算法:FIFO、LRU、LFU
    目录缓存淘汰算法FIFOLRULFU总结缓存淘汰算法 在高并发、高性能的质量要求不断提高时,我们首先会想到的就是利用缓存予以应对。 第一次请求时把计算好的结果存放在缓存中,下次遇到同...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作