Appearance
缓存穿透是指客户端请求的数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些 请求都会打到数据库。
常见解决方案
缓存空对象
请求的数据在缓存和数据库中都不存在时,在 Redis 中缓存个空值,这样下次再请求时,就 能使用到缓存了(虽然没有数据),而不会请求数据库。 优点:实现简单,维护方便。 缺点:
额外的内存消耗(设置 TTL 环节)
可能造成短期的不一致(之后正好插入了 id 是原先不存在的 id 的数据,要等 TTL 过期后才能访问到或者插入后覆盖缓存)
布隆过滤
客户端和 Redis 之间加一个布隆过滤器,在请求进入 Redis 之前先判断是否存在,不存在直接 拒绝请求。
优点:内存占用较少,没有多余 key。 缺点:
实现复杂
存在误判可能
增强 id 的复杂性,避免被猜测 id 规律。
做好 id 的基础格式校验。
加强用户权限校验
做好热点参数的限流
