zoukankan      html  css  js  c++  java
  • [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);
        }
    
    
    }
    ?>
    
    
  • 相关阅读:
    【转】Java操作CSV文件导入导出
    【转】Java压缩和解压文件工具类ZipUtil
    Python之multiprocessing.Pool(创建多个子进程)
    Openstack平台虚拟机疏散失败提示(pymysql.err.OperationalError) (2013, 'Lost connection to MySQL server during query')问题
    kubernetes部署redis主从高可用集群
    Ceph性能测试
    python日志模块
    kubernetes删除pod,pod一直处于Terminating状态
    python执行提示“ImportError: No module named OpenSSL.crypto”
    二进制部署kubernetes集群_kube-apiserver提示"watch chan error: etcdserver: mvcc: required revision has been compacted'
  • 原文地址:https://www.cnblogs.com/nonlyli/p/1699198.html
Copyright © 2011-2022 走看看