缓存的原理和引入与设计

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

缓存是我们在开发中提高性能的一大法宝,那么必然要对缓存的使用原理、设计架构、业务模式有一定的了解,本文主要针对以上内容进行阐述。

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 压力
相关推荐
neoooo8 分钟前
别慌,Java只有值传递——一次搞懂“为啥我改了它还不变”!
java·后端·spring
秋难降8 分钟前
Python 知识 “八股”:给有 C 和 Java 基础的你😁😁😁
java·python·c
wuxuanok11 分钟前
Web后端开发-请求响应
java·开发语言·笔记·学习
livemetee19 分钟前
spring-ai 1.0.0 (3)交互增强:Advisor 顾问模块
java
DDDDDouble24 分钟前
<二>Sping-AI alibaba 入门-记忆聊天及持久化
java·人工智能
一切顺势而行42 分钟前
kafka总结
java
yanjiaweiya1 小时前
云原生-集群管理
java·开发语言·云原生
gadiaola1 小时前
【JavaSE面试篇】Java集合部分高频八股汇总
java·面试
艾迪的技术之路2 小时前
redisson使用lock导致死锁问题
java·后端·面试