缓存用于读多写少的场景,数据中有大量的读,少量的写。这是一个比例,通常的比例是十几倍甚至几十倍,这时就会用缓存的优势来降低数据库的压力。
还有就是缓存的命中率问题,因为缓存的引入,增加了系统的复杂性,如果命中率不高的话,返回会使访问数据库变的更慢(因为每次请求都要先访问缓存)。
还有就是非常火的分布式缓存,大多数都是用的“非强制一致性”,在分布式环境下,由于网络延迟,很少有架构会完成绝对一直性。即使是现在的数据库,利用缓存的优势也是通过非绝对一致性完成(数据库会通过日志,冗余等方法来完成丢失数据的回补工作)。宕机后有可能丢失少量数据,但是通常我们认为宕机的概率很低,再加上这种机制可以带来巨大的性能优势,在某些场景下是值得做的。
通常缓存的访问频率很高,对于mysql来说,QPS达到几千就很高了,但是对于换来来说,达到十几万甚至几十万是很常见的,原因是缓存采用的K-V结构,他剥离了数据库原本存在的许多复杂的一致性概念,而且大部分情况下是在内存中完成的,通常它就处理简单的存取操作。
如果缓存的命中率达到了95%以上,那么系统肯定是比较成功的利用了缓存,反之,如果缓存的命中率过低,那么可以考虑放弃缓存。
其实在绝大多数传统应用中,数据库就足以支撑这些信息,只是很多时候大家想当然的认为必须要用缓存。