缓存常见问题
一、缓存失效问题
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、延迟删除失败后,进行重试