缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,导致这些请求直接到了数据库上,对数据库造成了巨大的压力,可能造成数据库宕机。
常见的解决方案:
1)缓存无效 key
如果缓存和数据库中都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间。
SET key value EX 60
,这种方式可以解决请求的 key 变化不频繁的情况,将无效 key 的过期时间设置短一点。
2)布隆过滤器
布隆过滤器是一种由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是器返回的结果是概率性的,而且不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且存放在布隆过滤器的数据不容易删除。
3)接口限流
根据用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制,例如将异常 IP 列入黑名单。
- 缓存空对象
- 优点:实现简单,维护方便
- 缺点:
- 额外的内存消耗
- 可能造成短期的不一致
- 布隆过滤器
- 优点:内存占用较少,没有多余的key
- 缺点:
- 实现复杂
- 存在误判可能
- 接口限流