1. 引入缓存后给业务带来的问题
业务系统引入缓存之后,架构由原来的两层架构变成了三层架构:
由此,带来了三个问题需要解决,分别是缓存读取、缓存更新和缓存淘汰。
1.1 缓存读取
缓存读取比较简单,查询数据时首先查询缓存,如果缓存命中,则从缓存中读取数据。如果缓存不命中,则查询数据库,并且更新缓存。
1.2 缓存更新
缓存更新时,在更新存储和更新缓存的先后关系上,如果选择更新缓存再更新存储,则有可能导致更新缓存成功但是更新存储失败,
(1)先删除缓存,再更新数据库
// todo
(2)先更新数据库,再删除缓存
// todo
1.3 缓存淘汰
主要有两种策略,分别是主动淘汰和被动淘汰:
- 主动淘汰:给键值对设置TTL时间,到期自动淘汰(推荐),这种方式可以达到缓存热数据的目的
- 被动淘汰:内存达到最大限制时,通过LRU、LFU算法淘汰(不推荐),这种方式影响缓存性能,缓存质量不可控
2. 缓存的三座大山
2.1 一致性
一致性主要解决一下几个问题:
(1)并行更新如何解决隔离性问题
// todo
(2)原子性更新时如何解决部分更新的问题
// todo
(3)如何解决读一致的问题
// todo
2.2 缓存击穿
缓存击穿指的是访问数据时直接绕过缓存,访问数据库。肯能会有两种原因造成这种现象:
一种是大量的空查询,比如黑客攻击;另外一种是缓存污染,比如大量的网络爬虫造成的。
(1)为了解决空查询带来的缓存击穿,主要有两种方案:
- 第一种是在缓存层前面再加一层布隆过滤器
- 第二种是把所有的key和热数据value加入缓存,在缓存层拦截空数据查询
(2)为了解决爬虫带来的缓存击穿问题,可以设置缓存策略:
- 针对更新的操作,需要立即缓存
- 针对读的操作,可以在设置是否立即缓冲还是延迟缓存,以及在规定的时间窗内命中的次数是否达到一定的次数才进行缓存
2.3 缓存雪崩
缓存雪崩指的是热数据集中淘汰,大量请求瞬间透传到存储层,导致存储层过载。
造成缓存雪崩的原因主要是TTL机制过于简单造成的,解决方案主要有以下:
(1)设置TTL时给过期时间加上一个随机的时间值
(2)每一次的访问都会重新更新TTL,此外业务可以更精准的指定热数据缓存时间