缓存对我们而言并不是一个陌生的词汇,使用缓存就是为了加快计算机读取数据的速度减小数据库的压力。但是,使用缓存也会牺牲一些其他方面的优势,比如牺牲了数据的强一致性。只要数据产生了副本,就一定会出现副本数据与原数据之间的差异,这就是一致性。因此,我们在使用缓存的时候就一定会失去一定的一致性,这是无法避免的。某些场景对数据的一致性要求并不是非常高,所以我们才使用缓存来换取更高的效率。
因此在评估一个系统技术解决方案是否需要使用缓存时,除了要评估使用缓存能否提高性能、能提升多少性能以外,还要看为了提高性能而牺牲的数据一致性能否让用户接受。举个例子:公司的财务系统要求实时查看各类财务信息,财务信息作为一个非常重要的数据来说,任何牺牲一致性的缓存都不应该存在。如果某位同事的工资已经发了,但是系统上面还现实未发,这将多么尴尬。使用缓存的终极目的是为了提高性能,但不能盲目。
适合使用缓存的场景有很多,在下面这些情况中使用缓存是非常明智的:
读密集型的应用;
存在热数据的应用;
对响应失效要求较高的应用;
对一致性要求不严格;
需要实现分布式锁的时候。
一个常见的例子:网站的首页需要查询到的数据通常都会使用缓存。一个原因是因为首页通常都需要非常快的响应速度,一旦响应速度慢了,用户流失将非常严重;另一个原因就是首页需要展示的数据一致性要求通常不高。基于这两点原因,我们完全可以使用缓存来达到我们的目的。
虽然使用缓存听起来很不错,甚至非常有逼格、有技术范了。但是,下面这些情况下千万不要使用缓存:
更新频繁,对于更新频率过高的数据,频繁同步缓存中的数据所花费的代价可能相当于从缓存中查询带来的好处。简而言之就是功过相抵,甚至还有更糟糕的情况,那就是功不抵过;
对一致性要求严格,比如上面举的例子,财务系统的财务数据,这就是个一致性要求严格的情况;
读少,对于读取非常少的系统而言,使用缓存就完全没有意义了,毕竟使用缓存的目的是为了读取数据更高效;
数据量很小的情况下,当然也没必要使用缓存了,因为数据库本身完全可以支持。
所以,在考虑采用某种技术解决方案的时候,不光要考虑它所带来的高性能,还要综合考虑其他的因素。比如成本,比如信息安全,比如用户可接受度等。
#### 欢迎关注我的公众号“java工会”,一起交流技术