从零学架构(二十三)


计算架构模式之分布式缓存架构设计

分布式缓存架构模式

数据缓存

结果缓存

复杂度:数据一致性

数据一致性解决方案

缓存三大问题

缓存穿透

定义

缓存没有起作用,业务系统虽然去缓存查询数据,但缓存中没有数据,业务系统需要再次去存储系统查询数据

场景
  1. 存储系统中确实不存在被访问的数据,例如被黑客攻击,导致大量无效业务请求
  2. 存储系统中存在,但是缓存中不存在的数据,例如冷门数据、老数据,常见的一个的一个场景是爬虫或者用户翻页翻到20页以后导致系统变慢
  3. 系统刚启动的时候,大量缓存还没生成。例如抢购、秒杀等,或者缓存节点刚启动。
  4. 缓存集中失效,例如批量生成的缓存批量失效,缓存服务器挂掉。
应对方法
  1. 空值缓存
  2. 缓存当前数据
  3. 缓存预热
  4. 随机失效

缓存雪崩

定义

当缓存失效(过期)后引起的系统性能急剧下降的情况

根因
  1. 生成缓存较慢(复杂的数据查询、大量的计算等)
  2. 缓存失效后并发请求量大,比如50个以上
应对方法
更新锁

方案:

  1. 对缓存的更新操作进行加锁保护,保证只有一个线程能够进行缓存更新
  2. 未能获取更新的线程要么等待锁释放后重新读取缓存,要么就返回空值或者默认值

优缺点:

  1. 需要引入分布式锁
  2. 能够保证只有一个线程能更新
后台更新

方案:

  1. 由后台线程来更新缓存,而不是业务线程来更新缓存
  2. 缓存有效期设置为永久,后台线程更新缓存,更新策略分为定时更新、事件触发更新
  3. 业务线程只读取缓存,缓存不存在就返回空值

优缺点:

  1. 实现简单
  2. 需要保证后台线程高可用

缓存热点

定义

特别热点的数据,如果大部分甚至所有的业务请求都命中同一份缓存数据,则这份数据所在的缓存服务器压力也很大,有可能撑不住。

场景

热点事件、突发事件,例如某明星吃瓜微博,短时间内上千万的用户来围观。

应对方法

多副本缓存

方案:

  1. 写入的时候,缓存的key加上编号,写入到多个缓存服务器
  2. 读取的时候随机生成编号组装key,然后读取

挑战:

不太好预料哪些key是热点(微博经常挂的原因),需要动态决策或者人工干预

小结


文章作者: maybe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 maybe !