缓存迁移
处理分布式缓存迁移是比较困难的,通常我们将其分为平滑迁移和停机迁移。
平滑迁移
步骤
- 双写
- 迁移历史数据
- 切读
- 下线双写
1、双写
按照新规则和旧规则同事往新缓存和旧缓存中写数据。
2、迁移历史数据
评估需要迁移的历史数据。在某些场景下,通过数据库回溯数据,不断有新数据写入新的缓存,历史数据会逐渐过时,在一定时间之后,新的集群中自然就有了最新的数据,也就不在需要迁移历史数据了。
3、切读
把应用层所有的读操作路由到新的缓存集群上。
4、下线双写
关闭双写开关,把写入旧集群的逻辑下线。
停机迁移
步骤
- 停应用
- 迁移历史数据
- 更改数据源配置
- 重启应用
这种方式的好处是实现简单、高效,能够有效的避免数据不一致,但需要有停止服务,一般在晚上交易量小或者非核心服务的场景下使用。
缓存防灾
缓存穿透
缓存穿透指的是使用不存在的Key进行大量的高并发访问,这导致缓存无法命中,每次请求都要穿透到后端数据库进行查询,使数据库的压力过大,操作数据库的性能下降。
解决思路
- 缓存空值,当再次接收到同样的查询请求时,直接返回空值;
- 对参数进行校验,拦截参数不合法的无效请求
缓存并发
缓存并发的问题通常发生在高并发的场景下,当一个缓存key过期时,因为访问这个缓存的key请求量过大,多个请求同事发现缓存过期,因此多个请求会同事访问数据库来查询最新的数据,并且写回缓存,当访问数据库的请求过大时,会造成数据库的性能下降。
解决思路
- 使用分布式锁,只让一个线程去访问数据库,并回写缓存,其余线程等待或立即返回空值;
- 软过期,不适用缓存服务器提供的过期时间,而是由业务程序判断是否过期并更新。
缓存雪崩
缓存服务器重启或大量缓存集中在某一个时间段内失效,给后端数据库造成瞬时的负载升高的压力,压垮数据库。
解决思路
- 对不同的数据,设置不同的过期时间。