天天看點

閱讀Nosql代碼有感

      這一年總得來說,讀書的時間不多。一是因為時間啥關系,這一年一直在跟着項目走,或者被項目牽着走,幾乎所有的時間和精力全部被拴在幾個項目上;不過所幸今年創業失敗,又回去上班了,時間相對空餘了一些。

      雙十一是一個好日子,持續關注的幾本書,幾乎五折入手,其中有一本叫做《mysql技術内幕-innodb存儲引擎》。工作閑暇之餘經常拿出來翻翻,所幸自己對于線程和資料結構比較紮實,讀起來雖然吃力,但是還是能吃透的。正是因為這本書的指引,讓自己對資料庫産生濃厚的興趣,加上之前使用mongodb和redis的經曆,讓我決定好好研究下資料庫。

   打開linux,eclipse,導入leveldb的工程,邊閱讀代碼邊調試起來;之後又添加了ssdb的代碼,修改了少量代碼,可以eclipse調試運作。

   leveldb是key-value形式的鍵值對資料庫,更多的贊美就不說了,最大的一個特點,leveldb的key是排序的,這個在ssdb中有很大的發揮;

   随着現在業務的開展,簡單的keyvalue的結構已經不能滿足更複雜的系統和業務,是以讓nosql支援更多的資料結構成為趨勢,于是redis再漸漸代替memcache,于是基于leveldb的支援更多資料結構的nosql越來越多,ssdb應該隻是其中一個吧。

      起初在我的臆想中,ssdb為了支援更多的資料結構,那麼應該也隻能從value下手,讓level多種類型;看了ssdb的代碼,才知道,原來人家是擴充的key,我們舉幾個例子。

      至簡單的key-value就不說,我們說說hash結構,比如一個玩家,有等級屬性,經驗屬性,名稱屬性,等等,因為leveldb隻支援最基本的keyvalue,是以我們這樣設計key,對于玩家archy,我們在資料庫中這樣設計,h-role-archy-level:2,h-role-archy-exp:200,h-role-archy-name:400。很多人估計要問了,這樣如何保證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截止就好。至于push,隻需要設定q-tasks-n和對應的值就ok。這樣我們就已經可以支援這個隊列結構了。

     代碼量不大,有興趣的可以去讀讀源代碼。

     我對于這些茫茫的nosql,感興趣隻是在mongo,leveldb,redis這幾個春節之前想熟悉這幾套;對于他的擴充,我想的是是否可以提供where的操作,比如我想查找level大于10級的玩家,而我卻不想搜尋資料庫,想利用索引的方式,将level排序,排序的值正好對應相應的玩家key就好,這樣就簡單實作了select中的where操作,想想還是蠻激動的!