热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ssdb的Yiicache扩展

google的leveldb越来越被很多人接受。国内的ideawu基于leveldb还写了一个ssdb的前置扩展用来实现了很多功能,比如标准的getset和hget,hset还有zset,zget,也实现了队列。当然pubsub就没有办法实现了。毕竟它和redis还是有点区别。基于标准的ssdb的类,写了

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。结果浪费了很长时间

推荐阅读
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • Redis API
    安装启动最简启动命令行输入验证动态参数启动配置文件启动常用配置通用命令keysbdsize计算key的总数exists判断是否存在delkeyvalue删除指定的keyvalue成 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 本文介绍了如何使用call_user_func_array函数向Redis中添加有序列表或集合。该函数可以接受一个数组作为参数,第一项是要操作的有序列表或集合的键,后续的项目是排序权重和值的交替。通过该函数,可以方便地向Redis中添加多个元素,并指定它们的排序权重。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 旁路|发生_Day749.旁路缓存:Redis是如何工作的Redis 核心技术与实战
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Day749.旁路缓存:Redis是如何工作的-Redis核心技术与实战相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Redis通用指令及数据库操作详解
    本文详细介绍了Redis中的通用指令,包括key的基本操作、扩展操作和查询模式,以及数据库的基本操作和相关操作。同时还解决了key重复问题,并提供了解决方案。文章内容参考了黑马Redis教程。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
author-avatar
执念
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有