布隆过滤器
skiplist
fingertable?
LSM树
目的是将随机写转化为快速的顺序写
1.写入时仅顺序写入内存(使用skiplist,按key有序),并同时记录log,保证安全
2.内存写满时开始写入磁盘,磁盘采用levelDB(google)的形式,是按key排序的
3.每个level的sstable存储一定范围的数据,不会重复(0层会)。
4.manifest存储元数据(?)包括每个sstable的最大最小key。current记录当前manifest
compaction
minor
指将内存写入磁盘,此过程不删除任何数据,因为删数据需要查找value,开销太大
major
指某一level的sstable大于一定数量之后会与下一level的是sstable合并。
特别的对于level0,由于该level的key有重叠,与下一level合并时,要遍历level,找到所有在该sstable范围内的数据与下一level的sstable合并
对于每个level要合并的sstable的选取,通过环形顺序选择
对于level k+1的sstable选择,同样选取level k的sstable范围内所有含有范围内数据的sstable,使用多路归并排序进行合并
Cuckoo哈希
使用两个hash计算得到两个桶的位置(也可能得到同一个桶)
若有空桶直接插入
若没有空桶,则移出一个桶,将数据插入,移出数据重复上述过程
可能出现循环,则设置最大替换次数,达到次数就扩容(扩容O(n)?)
SmallIndexLargeTable是Cuckoo哈希的巧妙修改