缓存命中率受什么影响?容量、访问分布、TTL 各自有多大作用?怎么在线上看命中率?这篇用一个有热点的访问序列和真实的 redis,把每个因素的影响量出来。
容量 命中率 平均耗时(未命中 5 ms,命中 0.05 ms)
100 33.4% 3.35 ms
500 54.8% 2.29 ms
2000 74.3% 1.32 ms
5000 84.0% 0.84 ms访问序列是我生成的 Zipf 分布(固定随机种子),不是真实流量;命中与未命中的耗时(0.05 ms 与 5 ms)是假设值。TTL 一节用模拟时钟,不是真的等了 20 秒。
Zipf(有热点) 命中率 54.8% 均匀随机 命中率 5.2%
TTL 0.05 秒 命中率 53.6% TTL 0.5 秒 命中率 53.6% TTL 1 秒 命中率 53.6% TTL 2 秒 命中率 63.0% TTL 5 秒 命中率 72.9% TTL 10 秒 命中率 78.9% TTL 不过期 命中率 84.0%
应用侧统计命中率 81.5% | redis 的 keyspace_hits 16300、keyspace_misses 3700 → 81.5% | evicted_keys 1650 | 当前 key 数 2050,已用内存 1.27M
redis 是自己在非默认端口起的临时实例,验证完就关闭了。