google的leveldb越来越被很多人接受。国内的ideawu基于leveldb还写了一个ssdb的前置扩展用来实现了很多功能,比如标准的getset和hget,hset还有zset,zget,也实现了队列。当然pub/sub就没有办法实现了。毕竟它和redis还是有点区别。 基于标准的ssdb的类,写了
google的leveldb越来越被很多人接受。国内的ideawu基于leveldb还写了一个ssdb的前置扩展用来实现了很多功能,比如标准的getset和hget,hset还有zset,zget,也实现了队列。当然pub/sub就没有办法实现了。毕竟它和redis还是有点区别。
基于标准的ssdb的类,写了个小扩展,扩展了Yii的Cache类:
class?CSsdbCache?extends?CCache?? {?? ????/**? ?????*?@var?string?hostname?to?use?for?connecting?to?the?redis?server.?Defaults?to?'127.0.0.1'.? ?????*/?? ????public?$hostname?=?'127.0.0.1';?? ????/**? ?????*?@var?int?the?port?to?use?for?connecting?to?the?ssdb?server.?Default?port?is?8888.? ?????*/?? ????public?$port?=?8888;?? ????/**? ?????*?@var?float? ?????*/?? ????public?$timeout?=?2000;?? ????public?$serializer?=?false;?? ????public?$_cache;?? ????protected?$_cachekeys?=?'ssdb_cachekey';?? ?????? ????public?function?init()?{?? ????????parent::init();?? ????}?? ????/**? ?????*?@return?SSDB? ?????*/?? ????public?function?getSsdbCache()?{?? ????????if?($this->_cache?!==?null)?? ????????????return?$this->_cache;?? ????????else?{?? ????????????return?$this->_cache?=?new?SimpleSSDB($this->hostname,?$this->port,?$this->timeout);?? ????????}?? ????}?? ????public?function?getkeys()?{?? ????????return?$this->getSsdbCache()->hkeys($this->_cachekeys,?"",?"",?$this->getSsdbCache()->hsize($this->_cachekeys));?? ????}?? ????/**? ?????*?Retrieves?a?value?from?cache?with?a?specified?key.? ?????*?This?is?the?implementation?of?the?method?declared?in?the?parent?class.? ?????*?@param?string?$key?a?unique?key?identifying?the?cached?value? ?????*?@return?string|boolean?the?value?stored?in?cache,?false?if?the?value?is?not?in?the?cache?or?expired.? ?????*/?? ????protected?function?getValue($key)?{?? ????????return?unserialize($this->getSsdbCache()->get($key));?? ????}?? ?? ????/**? ?????*?Stores?a?value?identified?by?a?key?in?cache.? ?????*?This?is?the?implementation?of?the?method?declared?in?the?parent?class.? ?????*?@param?string??$key????the?key?identifying?the?value?to?be?cached? ?????*?@param?string??$value??the?value?to?be?cached? ?????*?@param?integer?$expire?the?number?of?seconds?in?which?the?cached?value?will?expire.?0?means?never?expire.? ?????*?@return?boolean?true?if?the?value?is?successfully?stored?into?cache,?false?otherwise? ?????*/?? ????protected?function?setValue($key,?$value,?$expire)?{?? ????????$this->getSsdbCache()->hset($this->_cachekeys,?$key,?1);?? ????????if?($expire?>?0)?{?? ????????????//$expire?+=?time();?? ????????????return?$this->getSsdbCache()->setx($key,?serialize($value),?(int)?$expire);?? ????????}?? ????????else?{?? ????????????return?$this->getSsdbCache()->set($key,?serialize($value));?? ????????}?? ????}?? ????/**? ?????*?Stores?a?value?identified?by?a?key?into?cache?if?the?cache?does?not?contain?this?key.? ?????*?This?is?the?implementation?of?the?method?declared?in?the?parent?class.? ?????*?@param?string??$key????the?key?identifying?the?value?to?be?cached? ?????*?@param?string??$value??the?value?to?be?cached? ?????*?@param?integer?$expire?the?number?of?seconds?in?which?the?cached?value?will?expire.?0?means?never?expire.? ?????*?@return?boolean?true?if?the?value?is?successfully?stored?into?cache,?false?otherwise? ?????*/?? ????protected?function?addValue($key,?$value,?$expire)?{?? ????????return?$this->setValue($key,?$value,?$expire);?? ????}?? ????/**? ?????*?Deletes?a?value?with?the?specified?key?from?cache? ?????*?This?is?the?implementation?of?the?method?declared?in?the?parent?class.? ?????*?@param?string?$key?the?key?of?the?value?to?be?deleted? ?????*?@return?boolean?if?no?error?happens?during?deletion? ?????*/?? ????protected?function?deleteValue($key)?{?? ????????$this->getSsdbCache()->hdel($this->_cachekeys,?$key);?? ????????return?$this->getSsdbCache()->del($key);?? ????}?? ????/**? ?????*?@return?boolean?whether?the?flush?operation?was?successful.? ?????*/?? ????protected?function?flushValues()?{?? ????????$this->getSsdbCache()->multi_del($this->getkeys());?? ????????return?$this->getSsdbCache()->hclear($this->_cachekeys);?? ????}?? }??
其实代码很简单,不过由于ssdb默认没有serialize功能,所以在存储之前,得先主动的serialize,然后get的时候unserialize。不然就没有办法存储数组了。
由于ssdb没有flush功能。所以利用hget/hset将所有的key存储下来。flush的时候把hget获取的key读出来删除。然后再清掉这个hget的key
最后还有expire。ssdb里的setx第三个参数。。。居然不是expire,而是ttl。开始的时候,一直都当成expire。结果浪费了很长时间
原文地址:ssdb的Yii cache扩展, 感谢原作者分享。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

Dreamweaver Mac版
视觉化网页开发工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版
中文版,非常好用