正常流程
- 前端请求数据
- 先从缓存找,找到直接返回结果
- 取不到从数据库中取
- 数据库取到更新到缓存再返回结果
- 数据库也没有,返回空
缓存穿透
描述
用户不断发送内存和数据库中都没有的数据。导致数据库压力过大
解决
- 基础规则校验,如
id > 0
等屏蔽必然不存在的数据请求 - 布隆过滤器,排除必然不存在的数据
- 缓存和数据库都没有的数据,查出来之后可以将值设为空保存在内存中,设置有效期。
缓存击穿
描述
并发量大的时候缓存失效,导致请求全部压到了数据库上。
解决
- 热点数据永不过期
- 峰值前预热
- 读数据库加锁,只让一个线程读取数据库。获取锁失败的线程自旋,等待若干时间后再从内存中获取
缓存雪崩
描述
缓存中的数据大批量过期,导致数据查询量过大。缓存击穿是单个数据过期,缓存雪崩是多个数据过期
解决
- 缓存数据过期时间随机设置,防止同一时间设置的缓存又同时失效
- 分布式缓存可以将热点数据均匀分布在不同缓存数据库中
- 热点数据永不过期
- 后端进行服务降级和限流
网友评论