数据库
指持久化数据库,如
- mysql
- mongodb
缓存
指内存型的数据存储,如
- redis
- memcached
一个良好的缓存策略需兼顾
- 命中率
- 缓存数据与数据库数据的一致性
对命中率的兼顾
多大的命中率是好的?
用数学知识来分析这个问题,先设定几个关键的参数
- T(c):读一次缓存所需时间
- T(d):读一次数据库所需时间
- G:缓存命中率
一次数据读取所需的时间的期望值为:
T(c)*G + (T(c)+T(d))*(1-G)
增加数据库缓存的目标为提高数据读取速度,可以归结为一个表达式
T(c)*G + (1-G)*(T(c)+T(d)) < T(d)
等同于
T(c) - T(d)*G < 0
读取速度提升的比值为
(T(d)*G - T(c))/T(d)
假如,T(d)=50ms,T(c)=10ms,G=0.6,读取速度提升比值为
(50*0.6 - 10)/50 = 0.4
化为百分比也就是40%。
假如,T(d)=50ms,T(c)=10ms,G的值必须大于
G = T(c)/T(d) = 0.2
才能期望读取速度得到提升。
可以看出
加入缓存不一定能够提升读取性能,这取决于缓存读取速度、数据库读取速度以及缓存的命中率。