在使用缓存系统并且在系统存在高并发的情况下(可能要求强一致性),可能出现如下问题:
1. 缓存穿透
缓存穿透是指,查询的数据并不存在于缓存系统中导致必须查询DB的情况。
缓存穿透可能被利用作为系统攻击的点。例如:重复查询系统之不存在的key(不存在于缓存和DB)
解决思路:
如果查询的key不存在于缓存系统中那么,在缓存系统中增加此key,并且将值置为null(或其他的特殊值,此值代表缓存系统尚未收录),然后查询DB并更新至缓存系统。如果此key不存在于系统中,则将此key在缓存中置为特殊值(此特殊值表示系统不存在此值)
2.缓存并发
缓存高并发是指,在并发重复的大量请求缓存数据时,如果缓存系统不存在此key(可能时攻击也可能不是),那么将导致大量的重复请求首先引起缓存穿透问题,其次极大增加DB的压力,在此场景下缓存失去了应有作用。
缓存并发也可能被利用作为系统攻击点。除了上述的缓存穿透之外,也可能导致DB拒绝服务。例如:发送大量DB有但是缓存没有的数据(存在于DB不存在于缓存)
解决思路:
如果查询的是同一key,则加锁处理;如果查询时不同key则队列处理
3.缓存失效
缓存失效是指,给某些有时效性的缓存内容设定过期时间,到达过期时间之后,对应缓存失效了。简单拓展,缓存内容在没有被及时更新也是缓存失效,一般我们需要缓存的数据在我们修改DB的时候会同步修改缓存。
如果设定缓存失效时间都是一致的,那么会导致,在同一时间大量缓存失效,这时候如果有大量请求请求失效缓存则造成缓存穿透和缓存并发问题。
解决思路:
控制缓存失效时间,不让缓存在同一时间失效,失效时间对应不同的key设置随机时间失效,将请求分配到多个时间中减轻DB压力
4.缓存强一致性要求
缓存强一致性是指,缓存和DB是的操作时同步的。但是缓存和DB在实现强一致性时必然存在同步时间差。
解决思路:
首先我们需要保证我们的缓存系统时高可用的。在系统启动时将需要保证强一致性的数据载入缓存,所有操作和查询只修改缓存,缓存的数据可以异步的同步到DB。