Cache组件负责管理Block Cache,在RocksDB中的实现有两种,分别对应两种常用的缓存置换算法:LRUCache和ClockCache。由于ClockCache目前仍有bug,所以在生产环境总是使用默认的LRUCache。注意Cache有压缩的和非压缩的两种,这里只考虑默认的非压缩Cache。 LRUCache最核心的四个参数列举如下: capacity:缓存的总大小。 num_shard...
Block Cache有两种缓存实现,分别是 LRUCache 和 ClockCache。两种类型的缓存都使用分片以减轻锁争用。容量平均分配给每个分片,分片不共享容量。默认情况下,每个缓存最多会被分成 64 个分片,每个分片的容量不小于 512k 字节。 LRUCache: 默认的缓存实现。使用容量为8MB的基于LRU的缓存。缓存的每个分片都维护自己的LRU...
Cache组件负责管理Block Cache,在RocksDB中的实现有两种,分别对应两种常用的缓存置换算法:LRUCache和ClockCache。由于ClockCache目前仍有bug,所以在生产环境总是使用默认的LRUCache。注意Cache有压缩的和非压缩的两种,这里只考虑默认的非压缩Cache。 LRUCache最核心的四个参数列举如下: capacity:缓存的总大小。 num_shard...
在CLock cache中查找并不需要获取分片锁,只需要查找当前hash_map就可以了,只有在insert时需要获取分片锁。使用clock cache,相比于LRU cache,写吞吐有一定提升。 当创建clock cache时,也有一些可以配置的信息。 Capacity same as LRUCache num_shard_bits same as LRUCache strict_capacity_limit same as LRUCache S...
block中还分为data block数据块,meta block元数据块,footer块尾。每块的k-v都是有序的。data block也有缓存,名为block cache。顾名思义用于缓存SST文件中的热点数据到内存中,提供高速的读服务,所有ColumnFamily中都共用一块block cache。block cache可以设置两种数据结构:LRU cache和Clock cache。
ClockCache:基于 Clock 算法,clock 指针 + 环形列表 + 哈希表。 与LRU 缓存比较,Clock 缓存有更好的锁粒度。LRU 缓存读取数据时,需要对所有分片加互斥锁,因为需要更新的 LRU 列表;而在 Clock 缓存上读取数据时,不需要申请该分片的互斥锁,只需要搜索并行的哈希表。只有在插入的时候需要每个分片的锁,锁粒度更小...
Clock Cache ClockCache实现了CLOCK算法。CLOCK CACHE的每个shard都有一个cache entry的圆环list。算法会遍历圆环的所有entry寻找unspined entry来回收,但是如果上次scan操作这个entry被使用的话,也会有继续留在cache中的机会。寻找并回收entry使用tbb::concurrent_hash_map。
block中还分为data block数据块,meta block元数据块,footer块尾。每块的k-v都是有序的。data block也有缓存,名为block cache。顾名思义用于缓存SST文件中的热点数据到内存中,提供高速的读服务,所有ColumnFamily中都共用一块block cache。block cache可以设置两种数据结构:LRU cache和Clock cache。
Block Cache Size Block Cache Size 对于读性能来说至关重要,在 Flink 中的对应参数是state.backend.rocksdb.block.cache-size. 默认情况下,缓存清除算法用的是 LRU(Least Recently Used),这是一种有锁的算法。RocksDB 还提供了 Clock 算法可选。在我们的常见测试场景下,算法的影响并不大。
ClockCache:基于 Clock 算法,clock 指针 + 环形列表 + 哈希表。 与LRU 缓存比较,Clock 缓存有更好的锁粒度。LRU 缓存读取数据时,需要对所有分片加互斥锁,因为需要更新的 LRU 列表;而在 Clock 缓存上读取数据时,不需要申请该分片的互斥锁,只需要搜索并行的哈希表。只有在插入的时候需要每个分片的锁,锁粒度更小...