为数据库添加外部缓存带来的性能提升分析

数据库

指持久化数据库,如

  • mysql
  • mongodb

缓存

指内存型的数据存储,如

  • redis
  • memcached

一个良好的缓存策略需兼顾

  • 命中率
  • 缓存数据与数据库数据的一致性

对命中率的兼顾

多大的命中率是好的?

用数学知识来分析这个问题,先设定几个关键的参数

  • T(c):读一次缓存所需时间
  • T(d):读一次数据库所需时间
  • G:缓存命中率

一次数据读取所需的时间的期望值为:

1
T(c)*G + (T(c)+T(d))*(1-G)

增加数据库缓存的目标为提高数据读取速度,可以归结为一个表达式

1
T(c)*G + (1-G)*(T(c)+T(d)) < T(d)

等同于

1
T(c) - T(d)*G < 0

读取速度提升的比值为

1
(T(d)*G - T(c))/T(d)

假如,T(d)=50ms,T(c)=10ms,G=0.6,读取速度提升比值为

1
(50*0.6 - 10)/50 = 0.4

化为百分比也就是40%。

假如,T(d)=50ms,T(c)=10ms,G的值必须大于

1
G = T(c)/T(d) = 0.2

才能期望读取速度得到提升。

可以看出

加入缓存不一定能够提升读取性能,这取决于缓存读取速度、数据库读取速度以及缓存的命中率。