介绍一下Redis缓存雪崩和缓存穿透,如何解决这些问题?
3 分钟阅读
•
481 字
+
282 词
参考答案
-
缓存雪崩
是指在
某个时间点,大量缓存同时失效
,导致**请求直接访问数据库,增加了系统负载。**对于缓存雪崩,
- 可以通过 合理设置缓存的过期时间 , 分散缓存失效时间点 ,或者 采用永不过期的策略 ,再结合定期更新缓存。
- 设置缓存Redis集群,避免单机宕机的情况。
-
缓存击穿
是指
一个缓存中不存在但是数据库中存在的数据
,当有
大量并发请求查询这个缓存不存在的数据
时,
导致请求直接访问数据库,增加数据库的负载
。典型的场景是当一个缓存中的数据过期或被清理,而此时有大量请求访问这个缓存中不存在的数据,导致大量请求直接访问底层存储系统。
- 对于 缓存击穿 ,可以采用 互斥锁(例如分布式锁setnx) 或者 在查询数据库前先检查缓存是否存在 , 如果不存在再允许查询数据库,并将查询结果写入缓存。
- 缓存预热,提前加载数据
- 逻辑过期,存储一个过期时间字段(用户感知丝滑,数据一致性较弱,维护异步逻辑)
-
**缓存穿透是指查询一个在缓存和数据库都不存在的数据,这个数据始终无法被缓存,导致每次请求都直接访问数据库,增加数据库的负载。**典型的情况是攻击者可能通过构造不存在的 key 大量访问缓存,导致对数据库的频繁查询。
- 设置空值为value
- 对于 缓存穿透,可以采用布隆过滤器等手段来过滤掉恶意请求(存储合法key),或者在查询数据库前先进行参数的合法性校验 。