缓存穿透
请求的key大比例不是缓存的key,导致缓存失效,数据库压力上升。比如非法key的攻击。
方案一:当查询数据库为空记录时,缓存请求的key,下次请求时直接拒绝。问题,无法解决每次不同的key。
方案二:对key做校验,比如key的生成有一定的规则,通过该规则校验请求的key是否合法。可以解决部分的问题,适用的场景比较少。
方案三:对缓存key校验,把所有可能缓存的数据Hash到一个足够大的BitSet中,在缓存之前先从布隆过滤器中判断这个key是否存在,然后再操作。有一定的误识别率,删除困难。
方案四:把所有的key和value缓存。
缓存率:缓存数据占数据库的比例。可以动态调整缓存率。当请求并发上升时,主动调整缓存率。
穿透率:监控缓存穿透的比例。
命中率:监控缓存命中的比例。
缓存雪崩
在某一时刻,大量缓存同时失效,导致所有请求都去查询数据库,数据库压力太大。
对于AP要求高的系统,不可允许缓存雪崩的发生。
监控缓存率,突然下降,导致雪崩。
方案
一:缓存高可用,比如缓存集群。
二:设置缓存失效时间,不同的数据设置不同的有效期,统一规划有效期,让失效时间均匀分布。
三:对于热门数据的读取,设置定时更新数据的方式刷新缓存,避免其自动失效。
四:服务限流和接口限流:限制请求的并发量在可承受的范围内。
五:从数据库获取缓存需要的数据时加锁控制,本地锁或者分布式锁。通过加锁,避免大量请求同时访问数据库。