版本: beansdb 0.5.3
下载地点:
http://code.google.com/p/beansdb/
beansdb是豆瓣用来存储不变小object的支持中等数据规模的nosql的持久型数据库~跟memcache相比,主要特点如下
1. 数据是持久化的,value 完全在硬盘上操作,内存中只存放key的hash索引
2. 在持久化的基础上,为了提高可靠性,一份数据可以设置存放在多个地方
3. 把分布式坐在了客户端的api里,beansdb本身是单机的
4. 存储使用bitcast的方式~~ 跟b+树索引(tokyocabinet)和lsm(leveldb)又不一样的~挺巧妙~
5. beansdb没有实现expired功能~~~
6. 网络连接的管理直接搬了redis的实现~~~
下面主要介绍配置文件的工作方式,自带的example中的配置是这样的
BEANSDBCFG = {
"localhost:7901": range(16),
"localhost:7902": range(16),
"localhost:7903": range(16),
}
翻译过来就是
localhost:7901:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
localhost:7902:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
localhost:7903:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
客户端拿到这个配置,会做一下“倒排”
0:localhost:7901;localhost:7902;localhost:7903
1:localhost:7901;localhost:7902;localhost:7903
2:localhost:7901;localhost:7902;localhost:7903
。。。
15:localhost:7901;localhost:7902;localhost:7903
当客户端对key进行操作【set,get,delete】时,会先对key进行hash/16 ,然后你懂的,这里读和写有个比较trick的地方
读的时候
读到了会对其他同一个桶内的server做一个set,利于数据恢复.
def get(self, key):
ss = self._get_servers(key)
for i,s in enumerate(ss):
r = s.get(key)
if r is not None:
# self heal
for k in range(i):
ss[k].set(key, r)
return r
写的时候
会对统一个桶内的所有的server做写操作,由此达到冗余存储的目的~
总结:
1. 简单,够美
2. 基于磁盘,没有提供可选的expire功能,可能豆瓣的需求是用来存储不会删除,不经常改变的大量小object吧,按照作者的说法,是针对豆瓣海量音乐,图片的~~~
3. 配置文件的映射比较复杂~~
4. qps不会很高,因为依赖与单机的相应速度,几百qps的样子吧,不会太高
总之受益匪浅~~~ 好了就到这
谢谢