一、缓存击穿
1、概念
缓存击穿:由于并发查询同一热点数据而缓存的热点数据到时失效导致用户请求直接访问数据库,造成数据库压力过大。
2、业务场景
一款冷门商品突然爆火,原本redis中冷门商品数据设置了定时过期,爆火后大量请求同时去redis中访问该商品数据,恰巧该数据过期了,于是大量并发请求查询数据库,会导致数据库运行压力过大,从而影响其他业务。
3、解决方案
- 设置热门商品永不过期
- 使用双重检查锁,加锁排队,一次执行一条线程
二、缓存雪崩
1、概念
缓存雪崩:大量缓存数据同时间失效或者缓存服务器宕机,导致用户直接发起大量请求到数据库,数据库瞬间压力过大或宕机。
2、业务场景
redis中大量商品数据同时过期,大量用户直接向数据库请求查询商品信息,导致数据库运行压力过大或宕机。
3、解决方案
- 使用双重检查锁,加锁排队,设置随机过期时间
- 提前做好redis集群
三、缓存穿透
1、概念
缓存穿透:用户请求的数据既不存在缓存里,也不存在数据库里,导致每次请求都去查询数据库,从而数据库运行压力过大或宕机。
2、业务场景
攻击者伪造大量不存在的数据(比如:负数或者特别大的数),攻击数据库。
3、解决方案
- 参数校验
- 缓存空对象
- 布隆过滤器(黑名单、白名单)
四、redis的业务场景
- 缓存热点数据(经常会被查询,但是不经常被修改或者删除的数据)
- 限时的优惠活动信息、手机验证码
- 计数器(String)
- 分布式全局唯一id(String)
- 排行榜(SortedSet)
- 抽奖活动(set)
- 电商商品筛选(set)
- 构建队列系统(list)