logo头像
ICQL

microservice_缓存

缓存问题

1)缓存穿透

短时间内大批量请求不存在的key,缓存没有命中,大量请求落在了数据库上导致异常

解决方案:

(1)提前校验入参,避免无效数据查库
(2)查到不存在的数据时,往缓存写一份为空的数据,失效时间设置短一点
实际读库时,可以采用(进程锁+双重检测)控制查询流量
(3)布隆过滤器:不存在则一定不存在,存在则有可能不存在,过滤大量无效请求

2)缓存雪崩

短时间内大量key过期(失效),接着来的众多请求瞬间都落在了数据库上导致异常

解决方案:

(1)缓存失效时间(固定+随机),一定程度上缓解

3)缓存击穿

热点数据,某一key在缓存过期后,瞬间大批量请求落在数据库上导致异常

解决方案:

(1)实际读库的时候,采用(进程锁+双重检测)控制查询流量
(2)热点key设置失效时间为晚上凌晨的流量低峰



数据一致性

缓存和db的数据一致性

(1)并发较小时

先更新db,更新完再删除缓存

并发问题:

A线程读到旧数据,挂起
B线程写完新数据,删除缓存
A线程拿到旧数据再次写入到缓存

(2)并发较高时

不删除缓存,缓存失效时间放在流量低峰期,更新完db,直接更新redis
同时可以增加补偿写数据到redis

微信打赏

赞赏是不耍流氓的鼓励