前言
工作中遇到一些对kv存储的需求,比如推荐系统中需要存储一个商品id对应的相似商品id的 list,或者是一个用户的浏览过的商品id的list,这就需要一个键值对去存储。本文描述的存储基于这个需求简单的实现了一个版本,实际工作中要复杂的多,为了让读者便于理解,就基于这个分析一个主键为string的key,value是id的list的存储实现。本存储用java实现,底层采用mmap的方式,可以实现落盘,并且性能优秀。
存储系统结构
- index
数据的索引,每个key都会在index中记录它对应的value存储的位置。 - block
value实际存储的位置。 - table
一个完整的数据表,包含了block,index以及config。 - config
一些配置信息,记录比如当前使用的是哪一个索引。 - log
记录每条数据的日志信息
整个系统由以上几个主要模块构成,每写一条数据如下图所示。
如上图所示,如果有一个写入数据(key,value)的请求,首先会把这一条记录追加写在日志文件里,然后在通过配置信息选取一个索引(index)文件里,从索引文件里找到这个数据的key的记录,如果没有记录,新建一条记录,这个记录就是这个