设为首页 收藏本站
查看: 802|回复: 0

[经验分享] [incomplete]Memcached Element and ElementList auto version control [占位]

[复制链接]

尚未签到

发表于 2015-8-31 11:13:37 | 显示全部楼层 |阅读模式
  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);
}

}
?>

  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-106743-1-1.html 上篇帖子: [PHP]MemCached高级缓存 下篇帖子: php敏感词过滤
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表