你好,我是山茶,一个正在探索副业的程序员

缓存是我们在开发中提高性能的一大法宝,那么必然要对缓存的使用原理、设计架构、业务模式有一定的了解,本文主要针对以上内容进行阐述。
1. 缓存的引入
业务数据访问性能太低怎么办,这个时候排除代码bug导致,排除硬件资源,那么只能通过技术手段,既增加缓存的方式来提高业务的访问性能
缓存的定义
- 原始意义是指存取速度比一般随机存取记忆体(RAM)快的一种RAM,通常它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。
- 广义缓存的定义则更宽泛,任何可以用于数据高速交换的存储介质都是缓存,可以是硬件也可以是软件。
- 我们在工作中常说的缓存,通常都是缓存中间件软件redis或者是使用的技术方式方法。

缓存存在的意义
- 缓存存在的意义就是通过开辟一个新的数据交换缓冲区,来解决原始数据获取代价太大的问题,让数据得到更快的访问。
缓存的原理
缓存的基本思想
- 缓存构建的基本思想是利用时间局限性原理,通过空间换时间来达到加速数据获取的目的,同时由于缓存空间的成本较高,在实际设计架构中还要考虑访问延迟和成本的权衡问题(既性能成本)。

- 时间局限性原理,被获取过一次的数据在未来会被多次引用,比如一条微博被一个人感兴趣并阅读后,它大概率还会被更多人阅读,当然如果变成热门微博后,会被数以千万计算的更多用户查看。
- 以空间换时间,因为原始数据获取太慢,所以我们开辟一块高速独立空间,提供高效访问,来达到数据获取加速的目的。
- 性能成本 ,构建系统时希望系统的访问性能越高越好,访问延迟越低小越好。但维持相同数据规模的存储及访问,性能越高延迟越小,成本也会越高,所以在系统架构设计时,你需要在系统性能和开发运行成本之间做取舍。
缓存的优势与使用代价
优势
-
提升访问性能
-
降低网络拥堵
-
减轻服务负载
-
增强可扩展性

代价
增加系统复杂度:服务系统中引入缓存,代码逻辑代码设计复杂增加,会增加系统的复杂度
维护成本变高:由于缓存相比原始 DB 存储的成本更高,所以系统部署及运行的费用也会更高
学习成本变高:由于一份数据同时存在缓存和 DB 中,甚至缓存内部也会有多个数据副本,多份数据就会存在一致性问题,同时缓存体系本身也会存在可用性问题和分区的问题。需要我们加强对缓存原理、缓存组件以及优秀缓存体系实践的理解,从系统架构之初就对缓存进行良好设计,降低缓存引入的副作用
2. 如何根据业务来选择缓存模式和组件
首先要根据业务的特性,以及业务的使用场景结合缓存的不同模式进行选择与设定。

缓存的读写模式
业务系统读写缓存有 3 种模式:
- Cache Aside(旁路缓存)
- Read/Write Through(读写穿透)
- Write Behind Caching(异步缓存写入)
Cache Aside(旁路缓存)
整体的一个流模式是:业务应用方对于写,是更新 DB 后,直接将 key 从 cache 中删除,然后由 DB 驱动缓存数据的更新;而对于读,是先读 cache,如果 cache 没有,则读 DB,同时将从 DB 中读取的数据回写到 cache。

读策略的步骤是:
- 从缓存中读取数据;
- 如果缓存命中,则直接返回数据;
- 如果缓存不命中,则从数据库中查询数据;
- 查询到数据后,将数据写入到缓存中,并且返回给用户。
写策略的步骤是:
- 更新数据库中的记录;
- 删除缓存记录。
注意:在写策略的时候,不能先删除缓存记录,再去更新数据库中的记录。否则会造成数据不一致的问题出现,这就违背了这种模式的策略。
写策略顺序变更的导致出现数据不一致的错误示例
- 假设某个用户的年龄是 20,请求 A 要更新用户年龄为 21,所以它会删除缓存中的内容。这时,另一个请求 B 要读取这个用户的年龄,它查询缓存发现未命中后,会从数据库中读取到年龄为 20,并且写入到缓存中,然后请求 A 继续更改数据库,将用户的年龄更新为 21,这就造成了缓存和数据库的不一致

通过上面原理与使用方式可以得知,这种模式适合上方业务中说的业务二场景
Read/Write Through(读写穿透)
对于 Cache Aside 模式,业务应用需要同时维护 cache 和 DB 两个数据存储方,过于繁琐,于是就有了 Read/Write Through 模式。
在这种模式下,业务应用只关注一个存储服务即可,业务方的读写 cache 和 DB 的操作,都由存储服务代理。
存储服务收到写请求时,会首先查 cache,如果数据在 cache 中不存在,则只更新 DB,如果数据在 cache 中存在,则先更新 cache,然后更新 DB。
存储服务收到读请求时,如果命中 cache 直接返回,否则先从 DB 加载,回种到 cache 后返回响应

通过上面原理与使用方式可以得知,这种模式适合上方业务中说的业务二场景
Write Behind Caching(异步缓存写入)
Write Behind Caching 模式与 Read/Write Through 模式类似,也由数据存储服务来管理 cache 和 DB 的读写。
Write Behind Caching 与 Read/Write Through 模式不同点
- 数据更新时,Read/write Through 是同步更新 cache 和 DB
- 数据更新时,Write Behind Caching 则是只更新缓存,不直接更新 DB,采用异步批量的方式更新 DB。
Write Behind Caching 的特点
- 数据存储的写性能最高,非常适合一些变更特别频繁的业务,特别是可以合并写请求的业务,
- 案例:计数业务,一条 Feed 被点赞 1万 次,如果更新 1万 次 DB 代价很大,而合并成一次请求直接加 1万,则是一个非常轻量的操作。
Write Behind Caching 的缺点
- 即数据的一致性变差,甚至在一些极端场景下可能会丢失数据。比如系统 Crash、机器宕机时,如果有数据还没保存到 DB,则会存在丢失的风险。所以这种读写模式适合变更频率特别高,但对一致性要求不太高的业务,这样写操作可以异步批量写入 DB,减小 DB 压力