缓存

1.缓存击穿问题

question:热点Key过期/失效,众多请求涌进数据库怎么办

answer:

方案一,在缓存过期前主动更新一遍缓存

方案二,设计分布式锁,只允许一条获取到锁的请求进入数据库更新缓存,其他请求快速失败

方案三,永不过期,设置热点数据永不过期或者过期时间比较长。

2.缓存穿透问题

question:查询数据库和缓存都不存在的数据,对数据库造成压力,怎么解决

answer:

最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。

方案一,缓存无效key/查询请求

方案二,布隆过滤器

3.缓存雪崩解决方案

设置随机失效时间(可选):为缓存设置随机的失效时间,例如在固定过期时间的基础上加上一个随机值,这样可以避免大量缓存同时到期,从而减少缓存雪崩的风险。

提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。

持久缓存策略(看情况):虽然一般不推荐设置缓存永不过期,但对于某些关键性和变化不频繁的数据,可以考虑这种策略。

接口限流,对于每一种key,只允许一条获取到锁的请求进入数据库更新缓存,其他请求快速失败