Redis中的穿透,雪崩,击穿
Redis 中的穿透、雪崩和击穿是在高并发场景下可能出现的问题,它们会导致大量请求直接发送到后端数据库,造成数据库压力过大甚至故障。
穿透:指用户查询的数据在 Redis 和数据库中都不存在,导致请求直接落到数据库上。这种情况可能是由于恶意攻击或数据不存在导致的。解决方法包括null值或者设置一个ttl(过期时间),异常参数校验、空值缓存和布隆过滤器等。
雪崩:指 Redis 中的大量 key 在同一时间过期或者是Redis宕机,导致大量请求同时发送到数据库,造成数据库压力过大。这种情况可能是由于 Redis 缓存设置不当或缓存服务器故障导致的。
解决方法包括设置随机过期时间、搭建防止宕机,热点数据永不过期、使用互斥锁和限流等。
击穿:(又称热点key问题)指某个热点数据的 key 突然失效,导致大量请求直接发送到数据库,造成数据库压力过大。这种情况通常是由于热点数据的访问量过大或缓存过期时间设置不当导致的。解决方法包括设置热点数据永不过期、使用互斥锁和提前预热等。
简单来理解就是在特殊时期比如双十一,抢演唱会门票这些时期会有大量的访问,在这过程中redis里的一个值突然失效了就会有大量的访问落到数据库上导致服务器被击穿
为了避免这些问题的发生,可以采取以下措施:
- 合理设置 Redis 缓存的过期时间,避免大量 key 同时过期。
- 对热点数据进行特殊处理,如设置永不过期或使用互斥锁。
- 增加 Redis 服务器的容量,提高缓存的处理能力。
- 对数据库进行优化,提高数据库的查询性能。
- 实施限流和降级策略,在高并发情况下限制请求数量,保证系统的稳定性。