icql

缓存问题

1)缓存穿透

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

解决方案:

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

2)缓存雪崩

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

解决方案:

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

3)缓存击穿

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

解决方案:

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



数据一致性

缓存和db的数据一致性

(1)并发较小时

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

并发问题:

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

(2)并发较高时

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