在数据库的设计中,cache是极其重要的一个模块
命中率高,延迟低的cache是承受高QPS,低延时的关键
其中,在热点key场景下,全局cache很容易造成锁瓶颈
于是,我们可以采用thread local + global的两级cache,应对热点key
针对thread local cache的大小应该设置多大来进行讨论
问题
- 作为数据库的cache,采用 thread local + global 两级cache
- thread local 应对热点key,global 作为普通cache (可以参考leveldb 的 cache)
- 问:thread local 设置多大的效果较好?
解答
- 两级cache定位不同,因此我们只 care 热点key 的命中率
- 数学抽象
- a 代表热点key,b 代表普通key
- m 代表 a 的大小,n 代表 b 的大小
- p 代表 a 的QPS,q 代表 b 的QPS
- 理论答案
- 若相邻 a 之间,b 的个数为 x ,x 的 99 分位数为 y
- 则 m + y * n 大小的cache,可以使命中率达到 99%
- 特殊地
- 若热key在所有key中均匀分布
- 则 大于 (p * m + q * n) / p 的 cache,可以使命中率达到100%
- 一般的,若热key占10 %,key大小一致为10B,在设置大于100B的cache,可达到100%
- 由此可见,只考虑热点key的命中率,较小的cache,就能达到很好的效果