踩坑日记(二):记一次线上业务—Redis 的缓存雪崩

之前有介绍过目前小编负责的业务用户量相对是比较大的,并且几乎每次都有被攻击的情况。最近的一次线上问题是突然收到大量的数据库连接数不够用的异常预警。赶紧检查了数据库连接数使用情况,被分配的数量已经被用光了,并且不能临时增加连接数(和其他系统合用)。

但是之前遇到更大的流量也没有出现连接数不够用的情况,那肯定是某段业务的问题。通过监控来看出现大量查询用户信息的 sql 请求,但是业务中对已经对用户信息做了缓存处理,正常情况下不应该出现这种情况,到这里猜测可能遇到“缓存雪崩” 的现象了。

什么是缓存雪崩?
如果Redis中大量的缓存在同一时间全部失效掉,但是刚好这段时间同时有大量的请求被发起,那么去Redis 获取信息的时候没有获取到,就会直接去访问数据库,数据库的处理能力是有限的,有可能出现把数据库搞坏的情况。
简而言之,就是缓存中获取不到,而数据库中有数据,同时时间到期直接命中数据库。

遇到“缓存雪崩”大致有以下几种方案来解决:
1、加锁,保证单线程访问缓存,避免很多请求同时命中数据库。
2、Redis 缓存的Key值的失效时间不能设置为一样,建议写入缓存的时候采用随机时间来保证同一时间有大量缓存失效问题。
3、特殊情况下,可以将一些数据设置为用不失效。
小编这里采用的是第 2 中方案,在缓存用户信息的时候采用随机时间(某一时间范围内随机)。

猜你喜欢

转载自blog.csdn.net/zhenghhgz/article/details/118721217