• LRU算法实现


    LRU是Last Recent Used 缩写,做为一种缓存算法,将最近较少使用的缓存失效。memcache采用了该算法。如下采用了一种PHP的实现方式。该算法将每次新增的内容,放到缓存顶部,达到缓存极限时,将缓存底部的内容清除。可以通过如下PHP代码来模拟。

    <?php
    class LRUCache {
    
        private $head;
    
        private $tail;
    
        private $capacity;
    
        private $hashmap;
    
        public function __construct($capacity) {
            $this->capacity = $capacity;
            $this->hashmap = array();
            $this->head = new Node(null, null);
            $this->tail = new Node(null, null);
    
            $this->head->setNext($this->tail);
            $this->tail->setPrevious($this->head);
        }
    
        public function get($key) {
    
            if (!isset($this->hashmap[$key])) { return null; }
    
            $node = $this->hashmap[$key];
            if (count($this->hashmap) == 1) { return $node->getData(); }
    
            // refresh the access
            $this->detach($node);
            $this->attach($this->head, $node);
    
            return $node->getData();
        }
    
        public function put($key, $data) {
            if ($this->capacity <= 0) { return false; }
            if (isset($this->hashmap[$key]) && !empty($this->hashmap[$key])) {
                $node = $this->hashmap[$key];
                // update data
                $this->detach($node);
                $this->attach($this->head, $node);
                $node->setData($data);
            }
            else {
                $node = new Node($key, $data);
                $this->hashmap[$key] = $node;
                $this->attach($this->head, $node);
    
                // check if cache is full
                if (count($this->hashmap) > $this->capacity) {
                    // we're full, remove the tail
                    $nodeToRemove = $this->tail->getPrevious();
                    $this->detach($nodeToRemove);
                    unset($this->hashmap[$nodeToRemove->getKey()]);
                }
            }
            return true;
        }
    
        private function attach($head, $node) {
            $node->setPrevious($head);
            $node->setNext($head->getNext());
            $node->getNext()->setPrevious($node);
            $node->getPrevious()->setNext($node);
        }
    
        private function detach($node) {
            $node->getPrevious()->setNext($node->getNext());
            $node->getNext()->setPrevious($node->getPrevious());
        }
    
    }
    
    /**
     * Class that represents a node in a doubly linked list
     */
    class Node {
    
        private $key;
    
        // the content of the node
        private $data;
    
        // the next node
        private $next;
    
        // the previous node
        private $previous;
    
        public function __construct($key, $data) {
            $this->key = $key;
            $this->data = $data;
        }
    
        public function setData($data) {
            $this->data = $data;
        }
    
        public function setNext($next) {
            $this->next = $next;
        }
    
        public function setPrevious($previous) {
            $this->previous = $previous;
        }
    
        public function getKey() {
            return $this->key;
        }
    
        public function getData() {
            return $this->data;
        }
    
        public function getNext() {
            return $this->next;
        }
    
        public function getPrevious() {
            return $this->previous;
        }
    
    }
    





  • 相关阅读:
    【十五分钟Talkshow】fmplan(十五分钟计划)的初步想法
    #ifdef,#ifndef,#define,#endif解析
    mass Framework menu插件
    软件随想
    gwt+smartgwt framework网站开发
    .NET异步
    CentOS6
    【十五分钟Talkshow】谈谈HTML 5及其对Web开发人员的挑战和机遇
    MongoDB源码概述——日志
    TWaver在FTTX设备网管系统中的应用
  • 原文地址:https://www.cnblogs.com/phonecom/p/6218455.html
Copyright © 2020-2023  润新知