这一年总得来讲,读书的时间很少。一是由于时间啥关系,这一年一直在跟着项目走,或者被项目牵着走,几乎全部的时间和精力所有被拴在几个项目上;不过所幸今年创业失败,又回去上班了,时间相对空余了一些。mysql
双十一是一个好日子,持续关注的几本书,几乎五折入手,其中有一本叫作《mysql技术内幕-innodb存储引擎》。工做闲暇之余常常拿出来翻翻,所幸本身对于线程和数据结构比较扎实,读起来虽然吃力,可是仍是能吃透的。正是由于这本书的指引,让本身对数据库产生浓厚的兴趣,加上以前使用mongodb和redis的经历,让我决定好好研究下数据库。linux
打开linux,eclipse,导入leveldb的工程,边阅读代码边调试起来;以后又添加了ssdb的代码,修改了少许代码,能够eclipse调试运行;redis也能够在eclipse里面跑而且调试,只是你们须要在调试时候指定makefile文件。redis
leveldb是key-value形式的键值对数据库,更多的赞美就不说了,最大的一个特色,leveldb的key是排序的,这个排序的特性在ssdb中有很大的发挥。sql
随着如今业务的开展,简单的key-value的键值对结构已经不能知足更复杂的系统和业务,因此让nosql支持更多的数据结构成为趋势,因而redis再渐渐代替memcache,因而基于leveldb的支持更多数据结构的nosql愈来愈多,ssdb应该只是其中一个吧。mongodb
起初在个人臆想中,ssdb为了支持更多的数据结构,那么应该也只能从value下手,让leveldb的value多种类型,好比他的value再也不只是简单的string类型,而是有列表形式,有二叉树形式等等;看了ssdb的代码,才知道,原来做者是扩展的key,咱们举几个例子。数据库
简单的key-value的结构就不说,咱们首先说说hash结构,好比一个玩家,有等级属性,经验属性,名称属性,等等,由于leveldb只支持最基本的key-value的键值对结构,因此咱们这样设计key,对于玩家archy,咱们在数据库中这样设计,h-role-archy-level表示玩家的等级key,对应的值是2;h-role-archy-exp表示玩家的经验key,对应的值是200;h-role-archy-name表示的玩家名称key,对应的值是archy。不少人估计要问了,这样如何保证获得玩家archy全部的属性;就像大概相似于select * from role where id="archy"的操做;或者像redis中hgetall role:archy的操做;前面咱们已经讲过leveldb的key是排序的,再加上咱们的key定义规则,咱们能够轻易的从h-role-archy-""开始查找到 h-role-archy-level,若是查找到h-role-lopze-level,表示到底了,这样就实现了hgetall的操做。数据结构
再举个例子,queue的例子,好比咱们要建立一个tasks的队列,他的值包括archy,lopze,ramon,咱们这样去定义他的key,q-tasks-0对应值archy;q-tasks-1对应值lopez;q-tasks-2对应值roman;这样咱们取tasks队列中全部的值,就能够取q-tasks-"" 到 q-xxx(xxx不一样于tasks)截止就好。至于push,只须要设置q-tasks-n和对应的值就ok。这样咱们就已经能够支持这个队列结构了。eclipse
代码量不大,有兴趣的能够去读读源代码。nosql
我对于这些茫茫的nosql,感兴趣只是在mongo,leveldb,redis这几个春节以前想熟悉这几套;对于他的扩展,我想的是是否能够提供where的操做,好比我想查找level大于10级的玩家,而我却不想搜索数据库,想利用索引的方式,将level排序,排序的值正好对应相应的玩家key就好,这样就简单实现了select中的where操做,想一想仍是蛮激动的!线程