在使用缓存系统而且在系统存在高并发的状况下(可能要求强一致性),可能出现以下问题:缓存
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。并发