redis初略的看了下源代码,其中的数据结构对我的感触比较深,和自己项目用到的cache比较了一下,写下此文。
redis数据结构很丰富:String,List,Hash,Set,SortSet,而一般的cache只是个kv,也就是个hash。
redis支持这些数据结构很简单,把一般cache系统的key也进行了管理,把key也放在一个数据结构里面,这样可以对key进行一些计算,比如hash很难做到的范围查找等。
redis String可以认为是一般cache的hash。其他的数据结构一般都是key-subkey-value的形式,这样做的话通过key可以得到subkey-value,而subkey-value才是redis真正的数据结构。这让我想到,一般的kv系统自己实现包装一层数据结构的话,也能达到redis的效果。
List:也设计成key-subkey-value的形式。 一层key/value设计成key/subkey-value;另外key需要保存下来,因为可能需要一些统计功能,范围查找等,所以再设计一个key/value,key的具体值为list-key,value的值则为key-subkey-value中的key。 subkey-value设计成一个List,可以是排序的List,先进先出的List等等。比如:user:userid:123 user:userid:234;class:classid:123 class:classid:234插入后,两个kv表现为: 一个为list-key/user class;另外一个为user/ userid list和class/classid list.
Hash: 和List做法相似subkey-value为Hash即可。
Set:不太一样是key-value的形式,所以value是个set,也就是set value时,先取得value,是个set,然后修改set重新set回去。
SortSet:和Set相似,只是排序的,可以另外再定义一个数据结构进行排序字段的存储。
当然,自己封装会有很多问题,比如所有的数据都要从cache拿出来,修改后再put回去,网络的开销是很大的,也不能保证是原子操作,另外封装的数据结构的容量也不容小视;实际使用时还有很多要考虑。