高并发系统设计-缓存

该文章记录极客时间《高并发系统设计》系列文章的相关知识点,供以后自己查看。这篇文章主要介绍一下缓存的使用,从以下几个方面:缓存读写、缓存高可用、缓存穿透。

缓存读写

缓存的读写中最主要的写(缓存更新),不同的使用场景,一般会使用不同的更新策略。选择策略不同,会造成缓存与数据库数据之间的不一致性。

  • 先更新数据库,再更新缓存
  1. 造成数据不一致,如下:image
  2. 变更数据库和变更缓存是两个独立的操作,并没有对操作做任何的并发控制。当两个线程并发更新时候,就会因为写入顺序的不同造成数据的不一致。
  • 更新数据库后,删除缓存,读取未命中时,从数据库加载
    image
  1. 称为Cache Aside 策略(旁路缓存策略),最常见的策略,这个策略数据以数据库中的数据为准,缓存中的数据是按需加载的。它可以分为读策略和写策略。
  2. 读策略的步骤是:
    2.1 从缓存中读取数据;
    2.2 如果缓存命中,则直接返回数据;
    2.3 如果缓存不命中,则从数据库中查询数据;
    2.4 查询到数据后,将数据写入到缓存中,并且返回给用户。
  3. 写策略的步骤是:
    3.1 更新数据库中的记录;
    3.2 删除缓存记录。
  4. 这种策略也会出现缓存与数据库不一致,由于缓存的写入通常远远快于数据库的写入,所以出现概率较小,一般可以忽略。image
  5. Cache Aside当写入比较频繁时,缓存会被频繁地清理,会影响缓存的命中率。可以考虑两种解决方案:
    5.1 一种做法是在更新数据时也更新缓存,只是在更新缓存前先加一个分布式锁,对于写入的性能会有一些影响;
    5.2 另一种做法同样也是在更新数据时更新缓存,只是给缓存加一个较短的过期时间。
  • Write/Read Through策略
    用户只与缓存交互,缓存与数据库交互,读取与更新都通过缓存进行。
  1. Write Through:先查询要写入的数据在缓存中是否已经存在,如果已经存在,则更新缓存中的数据,并且由缓存组件同步更新到数据库中,如果缓存中数据不存在,直接更新数据库(可以省去一次写缓存)。
  2. Read Through: 先查询缓存中数据是否存在,如果存在则直接返回,如果不存在,则由缓存组件负责从数据库中同步加载数据。
  • Write Back策略
    核心思想是在写入数据时只写入缓存,并且把缓存块儿标记为“脏”的。而脏块儿只有被再次使用时才会将其中的数据写入到后端存储中。
    缺点:由于缓存一般使用内存,为非持久化,当掉电的情况下,会导致数据丢失。可以增加定时将脏数据写回数据库,来降低丢数据的可能。
缓存高可用性

缓存如果为单点,在异常时,会对系统性能造成重大的影响。可以通过分布式缓存来提高可用性。常见的方面一般有三种:客户端方案、中间代理层方案、服务端方案等。

  • 客户端方案
    在客户端配置多个缓存节点,通过缓存写入和读取算法策略来实现分布式。
  1. 写入数据时,需要把被写入缓存的数据分散到多个节点中,即进行数据分片;
  2. 读数据时,可以利用多组的缓存来做容错,提升缓存系统的可用性。关于读数据,这里可以使用主从和多副本两种策略,两种策略是为了解决不同的问题而提出的。
  • 中间代理层方案
    在应用代码和缓存节点之间增加代理层,客户端所有的写入和读取的请求都通过代理层,而代理层中会内置高可用策略。
  • 服务端方案
    通过服务端实现高可用性,例如: Redis Sentinel 方案
缓存穿透

缓存穿透其实是指从缓存中没有查到数据,而不得不从后端系统(比如数据库)中查询的情况。
缓存穿透不可避免,主要因为:缓存系统在容量上是有限的,不可能存储系统所有的数据,那么在查询未缓存数据的时候就会发生缓存穿透。
当缓存大量未命中时,大量的穿透请求超过了后端系统的承受范围造成了后端系统的崩溃。

  • 常见的解决方案:回写空值、使用布隆过滤器
  • 回种空值
    适应于数据库中不存的相应的值,造成缓存中不存在该值,每次访问都查询数据库,增加数据库压力。
  • 布隆过滤器
    用户首先根据布隆过滤器来判断数据是否存在,不存在则直接返回,如图:image
  1. 布隆过滤器有两个缺点:在判断元素是否在集合中时是有一定错误几率的; 不支持删除元素。可以通过多个hash函数,来减少误判的概率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值