• [incomplete]Memcached Element and ElementList auto version control [占位]


    This is my 1st version, maybe i can use getMulti and setMulti refactor it(优化之).

    class CacheUtils {
        const CACHE_MAX_VERSION = 10;
    
        private $memcache;
    
        private static $instance;
    
        private function __construct() {
            $this->memcache = new Memcache();
            $this->memcache->connect('127.0.0.1', 11211) or die('Can not connect to memcached server.');
        }
    
        public static function getInstance() {
            if(self::$instance == null) {
                self::$instance = new CacheUtils();
            }
            return self::$instance;
        }
    
        public function addElementVersion($type) {
            $key = 'Element_Version:'.$type;
            $ver = $this->memcache->increment($key);
            if ($ver == false) {
                $ver = $this->memcache->set($key, 0);
                $ver = $this->memcache->increment($key);
            }
            else if ($ver > self::CACHE_MAX_VERSION) {
                // flush all! keep data correct
                $this->memcache->flush();
            }
            return $ver;
        }
    
        public function getElementVersion($type) {
            $key = 'Element_Version:'.$type;
            return $this->memcache->get($key);
        }
    
        public function addElement($elem) {
            $key = 'Element:'.$elem->type.':'.$elem->id;
            $retE = $this->memcache->set($key, $elem);
            $retV = $this->addElementVersion($elem->type);
            return $retE && $retV;
        }
    
        public function getElement($type, $id) {
            $key = 'Element:'.$type.':'.$id;
            return $this->memcache->get($key);
        }
    
        public function getElementListVersion($type, $sql) {
            $key = 'Element_List_Version:'.$type.':'.$sql;
            return $this->memcache->get($key);
        }
    
    
        public function addElementList($type, $list, $sql = '') {
            $keyList = 'Element_List:'.$type.':'.$sql;
            $keyVersion = 'Element_List_Version:'.$type.':'.$sql;
    
            $ver = $this->getElementVersion($type);
            $retL = $this->memcache->set($keyList, $list);
            $retV = $this->memcache->set($keyVersion, $ver);
    
            return $retL && $retV;
        }
    
        public function getElementList($type, $sql = '') {
            $keyList = 'Element_List:'.$type.':'.$sql;
    
            $elementVersion = $this->getElementVersion($type);
            $elementListVersion = $this->getElementListVersion($type, $sql);
            if ($elementListVersion != $elementVersion)
                return false;
            else
                return $this->memcache->get($keyList);
        }
    }
    

    Test Case:

    <?php
    require_once 'PHPUnit/Framework.php';
    
    require_once dirname(__FILE__).'/../CacheUtils.php';
    
    class Person {
        public $id;
        public $name;
        public $age;
    
        public $createTime;
        public $type;
    
        function __construct($id, $name, $age) {
            $this->id = $id;
            $this->name = $name;
            $this->age = $age;
    
            $this->type = get_class($this);
            $this->createTime = time();
        }
    }
    
    /**
     * Test class for CacheFacade.
     * Generated by PHPUnit on 2010-03-28 at 04:07:43.
     */
    class CacheUtilsTest extends PHPUnit_Framework_TestCase {
        /**
         * testAddElement
         */
        public function testAddAndGetElement() {
            $cacheUtils = CacheUtils::getInstance();
    
            $person = new Person(101,'Linx', 29);
            $this->assertEquals(true, $cacheUtils->addElement($person));
    
            $personGet = $cacheUtils->getElement('Person', 101);
            $this->assertEquals('Linx', $personGet->name);
            var_dump($personGet);
    
        }
    
        public function testAddAndGetElementList() {
            $cacheUtils = CacheUtils::getInstance();
    
            $person1 = new Person(101,'Linx1', 29);
            $person2 = new Person(102,'Linx2', 30);
            $list = array($person1, $person2);
    
            $this->assertEquals(true, $cacheUtils->addElementList('Person', $list));
    
            $listGet = $cacheUtils->getElementList('Person');
            $this->assertEquals(2, count($listGet));
            $this->assertEquals('Linx1', $listGet[0]->name);
    
            var_dump($listGet);
        }
    
        public function testAddAndGetElementListExpired() {
            $cacheUtils = CacheUtils::getInstance();
    
            $person1 = new Person(101,'Linx1', 29);
            $person2 = new Person(102,'Linx2', 30);
            $list = array($person1, $person2);
    
            $this->assertEquals(true, $cacheUtils->addElementList('Person', $list));
    
            // Person v2
            $this->assertEquals(true, $cacheUtils->addElement($person1));
    
            // v1 is expired
            $listGet = $cacheUtils->getElementList('Person');
            $this->assertEquals(false, $listGet);
    
            var_dump($listGet);
        }
    
    
    }
    ?>
    
    
  • 相关阅读:
    centos7之防止root密码被破解
    近期codeforces做题的总结?(不定期更新)
    小程序分享微信好友
    小程序自定义头部导航栏滑动颜色渐变
    小白快速上手的react.js教程
    架构型设计模式-同步模式
    仿vue-cli写一个简易的脚手架
    VUE基础知识篇-vue从零开始学VUE
    彻底理解Vue组件间7种方式通信
    设计模式--观察者模式
  • 原文地址:https://www.cnblogs.com/nonlyli/p/1699198.html
Copyright © 2020-2023  润新知