缓存那些事

缓存策略那些事

对于如今互联网行业的快速发展,为适应和满足各种需求的应用场景,我们不能仅依赖传统的关系型数据库,同时在软件设计上达到高性能,高可用的特性,加入一个缓存中间件显得格外的必要,而缓存概念说起来简单,但实际上缓存的策略会极大的影响着我们的系统,先前在工作上有加入了Redis中间件提供缓存服务,但在实现中缺遇到了很多问题—缓存策略。

更新缓存的策略有四种:

  • Cache aside
  • Read through
  • Write through
  • Write behind

Cache aside

这是我们最常用的模式,逻辑如下:

  1. 失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放到缓存中。
  2. 命中:应用程序从cache中取数据,取到后返回。
  3. 更新:先把数据存到数据库中,成功后,再让缓存失效。

##Read through
Read Through 套路就是在查询操作中更新缓存,也就是说,当缓存失效的时候(过期或LRU换出),Cache Aside是由调用方负责把数据加载入缓存,而Read Through则用缓存服务自己来加载,从而对应用方是透明的。

##Write through
Write Through 套路和Read Through相仿,不过是在更新数据时发生。当有数据更新的时候,如果没有命中缓存,直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)

Write behind

一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的I/O操作飞快无比(因为直接操作内存嘛 ),因为异步,write backg还可以合并对同一个数据的多次操作,所以性能的提高是相当可观的。
但是,其带来的问题是,数据不是强一致性的,而且可能会丢失(我们知道Unix/Linux非正常关机会导致数据丢失,就是因为这个事)。在软件设计上,我们基本上不可能做出一个没有缺陷的设计,就像算法设计中的时间换空间,空间换时间一个道理,有时候,强一致性和高性能,高可用和高性性是有冲突的。软件设计从来都是取舍Trade-Off。