0%
一、前言
二、缓存问题和解决
1. 缓存击穿
- 缓存击穿是指缓存中没有但是数据库中有的数据,一般是缓存到期。由于并发用户特别多,同时读缓存没有读到数据,就到数据库进行查询而形成压力
1.1. 解决方案
2. 缓存雪崩
- 缓存雪崩是指同一时间缓存大面积失效,所有请求都会落到数据库上,造成数据库短时间处理大量请求而崩掉
2.1. 解决方案
- 缓存数据的过期时间要随机设置,防止同一时间大量数据过期
- 给每个缓存数据添加缓存标记,记录缓存是否失效,标记失效立即更新,消耗较大,需要做监控
- 缓存预热,系统刚启动时先不对外提供服务,先将数据存入缓存再对外提供数据
- 互斥锁,对于某个key进行互斥,只让少量请求进行数据库操作,其余的进行排队,然后更新到缓存后就可以对缓存进行操作
3. 缓存穿透
- 缓存穿透是指缓存和数据库中都没有数据,导致所有请求都落到数据库上
- 一般是攻击数据库会造成
3.1. 解决方案
- 接口层增加校验,用户鉴权、id格式校验等
- 从缓存和数据库都取不到的数据,设置key-value为key-null,有效时间可以短一点,防止用户使用同一个key进行攻击
- 使用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一定不存在的数据会被bitmap进行拦截,减少对底层数据库的查询
三、热key问题的处理
1. 本地缓存
2. 热key探查
- 集群环境下,所有流量会分布到不同设备上,在客户端进行探查会不够真实,所以一般是在客户端到redis之间添加proxy进行热key探查
2.1. 京东
- 在客户端和redis之间添加一层proxy,proxy对所有key进行访问统计
- 推送到客户端上,客户端对热key进行本地缓存
2.2. 阿里云
- 同样是proxy,但是热key的缓存放到proxy上,不会推送给客户端

微信支付

支付宝