计算架构模式之分布式缓存架构设计
分布式缓存架构模式
数据缓存
结果缓存
复杂度:数据一致性
数据一致性解决方案
缓存三大问题
缓存穿透
定义
缓存没有起作用,业务系统虽然去缓存查询数据,但缓存中没有数据,业务系统需要再次去存储系统查询数据
场景
- 存储系统中确实不存在被访问的数据,例如被黑客攻击,导致大量无效业务请求
- 存储系统中存在,但是缓存中不存在的数据,例如冷门数据、老数据,常见的一个的一个场景是爬虫或者用户翻页翻到20页以后导致系统变慢
- 系统刚启动的时候,大量缓存还没生成。例如抢购、秒杀等,或者缓存节点刚启动。
- 缓存集中失效,例如批量生成的缓存批量失效,缓存服务器挂掉。
应对方法
- 空值缓存
- 缓存当前数据
- 缓存预热
- 随机失效
缓存雪崩
定义
当缓存失效(过期)后引起的系统性能急剧下降的情况
根因
- 生成缓存较慢(复杂的数据查询、大量的计算等)
- 缓存失效后并发请求量大,比如50个以上
应对方法
更新锁
方案:
- 对缓存的更新操作进行加锁保护,保证只有一个线程能够进行缓存更新
- 未能获取更新的线程要么等待锁释放后重新读取缓存,要么就返回空值或者默认值
优缺点:
- 需要引入分布式锁
- 能够保证只有一个线程能更新
后台更新
方案:
- 由后台线程来更新缓存,而不是业务线程来更新缓存
- 缓存有效期设置为永久,后台线程更新缓存,更新策略分为定时更新、事件触发更新
- 业务线程只读取缓存,缓存不存在就返回空值
优缺点:
- 实现简单
- 需要保证后台线程高可用
缓存热点
定义
特别热点的数据,如果大部分甚至所有的业务请求都命中同一份缓存数据,则这份数据所在的缓存服务器压力也很大,有可能撑不住。
场景
热点事件、突发事件,例如某明星吃瓜微博,短时间内上千万的用户来围观。
应对方法
多副本缓存
方案:
- 写入的时候,缓存的key加上编号,写入到多个缓存服务器
- 读取的时候随机生成编号组装key,然后读取
挑战:
不太好预料哪些key是热点(微博经常挂的原因),需要动态决策或者人工干预