SSDB是把leveldb增加了网络支持,兼容redis API,例如hash,zset等,目前很多业务在使用redis的时候发现内存成本高,但又习惯使用redis丰富的数据结构,因而迁移到SSDB是一个选择。
SSDB是如何将丰富的数据结构存入leveldb这种只支持kv的存储系统中呢?
有两种方案,用hash举例。
(1)将整个hash看做一个kv,存储到leveldb中,这时会有读写放大问题,本来是想读写hash中的某个field,但必须将这个hash整个加载到内存,因而这种方案不能支持较多的field。如果业务的很多场景都是将hash或set看做一个整体来处理,那么可以使用这种方案。
(2)将hash中的单个field看做一个kv,这种情况需要对field进行编码,同时为了防止编码后的key与用户的其它key重复,需要对所有key都采用类似的编码,但这种方案对于一次需要操作多个field的命令也是很伤的,幸好leveldb是有序的,在一定程度上减弱了它的影响。SSDB就是采用的这种方案。
下面是SSDB对hash field的编码代码。
inline static
std::string encode_hash_key(const Bytes &name, const Bytes &key){
std::string buf;
buf.append(1, DataType::HASH);
buf.append(1, (uint8_t)name.size());
buf.append(name.data(), name.size());
buf.append(1, '=');
buf.append(key.data(), key.size());
return buf;
}
新生成的key包含了三个信息:DataType,name和key。
网友评论