这是我参与「第五届青训营」笔记创作活动的第12天
- 使用了redislabs/rebloom作为镜像,该镜像集成了布隆过滤器插件,在项目中也有使用布隆过滤器(但测试的时候发现很麻烦,所以配置文件中添加了一个开关,测试的时候就关掉了)
- 使用的客户端是redigo,因为方便配置连接池
- 缓存穿透
当用户访问的数据,既不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库时,发现数据库中也没有要访问的数据,没办法构建缓存数据,来服务后续的请求。那么当有大量这样的请求到来时,数据库的压力骤增,这就是缓存穿透的问题。
缓存穿透的发生可能是黑客恶意攻击,故意大量访问某些读取不存在数据的业务;
- 在本项目中可能出现的地方有:
-
- 用户模块——登录、关注,同时大量登录、关注不存在的用户。
我们的解决措施是: 使用布隆过滤器快速判断数据是否存在该userId,避免通过查询数据库来判断数据是否存在。我们在写入用户信息到数据库时,添加该用户id到布隆过滤器中。
- 缓存雪崩
当大量缓存数据在同一时间过期(失效)或者 Redis 故障宕机时,如果此时有大量的用户请求,都无法在 Redis 中处理,于是全部请求都直接访问数据库,从而导致数据库的压力骤增,严重的会造成数据库宕机,从而形成一系列连锁反应,造成整个系统崩溃,这就是缓存雪崩的问题。
我们的解决措施是:过期时间统一为一天加一个小时内的随机值,让缓存失效的时间点尽量均匀,防止缓存雪崩,布隆过滤器没有设置过期时间。
- 缓存击穿
我们的业务通常会有几个数据会被频繁地访问,比如关注操作,这类被频地访问的数据被称为热点数据。
如果缓存中的某个热点数据过期了,此时大量的请求访问了该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易就被高并发的请求冲垮,这就是缓存击穿的问题。
我们的解决措施是:分布式互斥锁。