缓存常见问题

一、缓存失效问题

1、缓存穿透

1)现象:查询一个不存在的数据,即在缓存层和存储层都不存在。

2)解决:

I、布隆过滤器

类似hash,返回存在不一定存在,返回不存在就一定不存在。缺点是需要灌入所有输入。

II、缓存空对象+超时时间

2、缓存击穿/失效

1)现象:缓存中Key批量过期,导致大量请求击穿到数据库。

2)解决:

I、缓存定期刷新,错开缓存失效时间

II、分布锁同步请求;

3、缓存雪崩

1)现象:缓存层崩溃后,请求直接打向存储层,导致存储层也级联崩溃。

2)解决:

I、增强缓存:多级缓存,缓存提前水平扩容

II、访问存储层限流:对访问存储层进行限流,防止雪崩

二、缓存和Mysql双写一致性问题

1、缓存和Mysql双写可能导致不一致的关键点:

1)双写顺序,先写Mysql,然后再写缓存,因为Mysql支持回滚,而缓存不支持。

2)网络故障,网络故障导致第一层写入顺序和第二层写入顺序不一致。

2、解决方案

1)双写改为,两删一写+同步

I、删除缓存数据

II、写入数据到Mysql

III、删除缓存数据

IV、监听Mysql Binlog,同步写操作至缓存

2)延时双删 + 重试

I、删除缓存数据

II、写入数据到Mysql

III、延迟一段时间,再删一次缓存数据

IV、延迟删除失败后,进行重试

评论