redis类的实现

nosql数据库redis提供了一系列的C接口,使用比较方便,但是对于一些任务,仍然存在很大的代码重复性,为了解决这种代码重复的问题,本文拟封装这些操作。

关于redis的命令,可以参考http://redis.readthedocs.org


模板还是继承?

这是一个困扰我很多天的问题:如果想要实现一个通用的类库,需要兼容多种的写入数据类型,如何统一?如果使用了类模板,那么,统一接口的问题得以解决,但是,可能引入了需要为不同的数据类型特化接口的问题——结果就是引入了一个需要为每一种数据结构实现不同 操作工作的monster。
这种设计,不得不说是一个维护和扩展的噩梦。

新的方案——泛化数据操作,特化基础数据库操作

经过几天的考虑,最终想到了另外的解决方案:
基类中使用proteced实现所有的数据库基本操作类型,例如:
像这些操作,可以很好的集成在基类中,不会存在数据的不同带来的不同操作。
对于和数据相关的操作,可能由于数据的不同,造成不同的操作方式,因此采用一些泛化的技术进行实现。

泛化数据操作

下面将根据redis支持的不同数据结构做泛化的分析。
string
string是redis中最简单、基础的一种数据结构,但是也是用法最为复杂的一种结构,其原因就是string的数据类型能够保证其是二进制安全的,value可以存储任何东西,从一幅图片到一部电影,只要在内存限制的范围内(512MB),you are the boss:
  1. string可以简单的被用为key-value存储介质(set,mset,get,mget...)
  2. 可以使用value存储int,float做相关的统计工作(incr,decr,incrby,decrby,incrbyfloat)
  3. string可以被用作bitset去做bitset的工作。(对应的命令为getbit和setbit)
在redis的官网上是这么说的:
  • Use Strings as atomic counters using commands in the INCR family: INCRDECRINCRBY.(用作原子计数器
  • Append to strings with the APPEND command.(添加数据到string的尾部
  • Use Strings as a random access vectors with GETRANGE and SETRANGE.(把string当做随机访问向量
  • Encode a lot of data in little space, or create a Redis backed Bloom Filter using GETBIT and SETBIT.(编码压缩,布隆过滤器

string中支持的操作如下:
String(字符串) 根据上述的分析,对于数值类型的操作可以不考虑接口参数的泛化问题,整数的操作可以直接设定为int,浮点数的操作设置为double;但是对于set和mset等操作,为了支持多种数据结构,我们可以首先对数据结构本身做一个抽象, 使之提供抽象的toString接口、string2member的接口,以及参数为string类型的构造函数。这样,只要是该种数据结构,就可以使用多态的方式很好的完成set以及mset的操作(为什么要提供这样的操作?主要的核心思想是考虑到了value存储字段的特化, 可以用一个value的字符串来存储多种信息,为啥不用hash呢?最大的优点在于比hash的操作简单——hash需要多次取值)。

hash
hash同样也是每一个nosql必须支持的数据结构,对于redis来说,其存储结构为key-filed-value形式,即key后跟filed,filed再跟value的值。同上述的讨论,当需要写入的数据结构较为复杂的时候,同样需要采用处理string中value的方式来处理hash中的value数据。
redis支持的操作如下:
Hash(哈希表) 同样,在接口中,key和filed可以固定为char*的类型,为了支持value的可扩展性,value接受的值的类型可以是上文中提到的抽象的数据结构(支持转化为string和由string产生)。

list
redis的list是个人认为最为 飘逸的一个数据结构实现,可以使用list实现生产者、消费者模型(BLPOP,BRPOP),可以使用list实现循环队列(RPOPLPUSH, BRPOPLPUSH)。合上述的讨论一致,对该数据结构存储的value也采用上述的抽象数据格式实现。
set
redis的集合底层根据笔者推算是根据list做到的实现,set支持交集,并集以及差集的运算,这些运算在做统计工作的时候是非常有效的。由于不care数据,只关心key,对于set的操作,可以使用内建的数据类型。
有续集合的存储格式是key [score member] [...]值和成员的对,sorted set添加、删除和更新元素的时间复杂度为logN
这里仍然采用上文提及的抽象数据成员的解决方案。





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值