1、缓存一致性问题面试
当数据时效性要求很高时,须要保证缓存中的数据与数据库中的保持一致,并且须要保证缓存节点和副本中的数据也保持一致,不能出现差别现象。算法
这就比较依赖缓存的过时和更新策略。通常会在数据发生更改的时,主动更新缓存中的数据或者移除对应的缓存。sql
2、缓存并发问题数据库
缓存过时后将尝试从后端数据库获取数据,这是一个看似合理的流程。可是,在高并发场景下,有可能多个请求并发的去从数据库获取数据,对后端数据库形成极大的冲击,甚至致使 “雪崩”现象。后端
此外,当某个缓存key在被更新时,同时也可能被大量请求在获取,这也会致使一致性的问题。那如何避免相似问题呢?缓存
咱们会想到相似“锁”的机制,在缓存更新或者过时的状况下,先尝试获取到锁,当更新或者从数据库获取完成后再释放锁,其余的请求只须要牺牲必定的等待时间,便可直接从缓存中继续获取数据。服务器
3、缓存穿透问题网络
缓存穿透在有些地方也称为“击穿”。不少朋友对缓存穿透的理解是:因为缓存故障或者缓存过时致使大量请求穿透到后端数据库服务器,从而对数据库形成巨大冲击。架构
这实际上是一种误解。真正的缓存穿透应该是这样的:并发
在高并发场景下,若是某一个key被高并发访问,没有被命中,出于对容错性考虑,会尝试去从后端数据库中获取,从而致使了大量请求达到数据库,而当该key对应的数据自己就是空的状况下,这就致使数据库中并发的去执行了不少没必要要的查询操做,从而致使巨大冲击和压力。
能够经过下面的几种经常使用方式来避免缓存传统问题:
一、缓存空对象
对查询结果为空的对象也进行缓存,若是是集合,能够缓存一个空的集合(非null),若是是缓存单个对象,能够经过字段标识来区分。这样避免请求穿透到后端数据库。
同时,也须要保证缓存数据的时效性。这种方式实现起来成本较低,比较适合命中不高,但可能被频繁更新的数据。
二、单独过滤处理
对全部可能对应数据为空的key进行统一的存放,并在请求前作拦截,这样避免请求穿透到后端数据库。这种方式实现起来相对复杂,比较适合命中不高,可是更新不频繁的数据。
4、缓存颠簸问题
缓存的颠簸问题,有些地方可能被成为“缓存抖动”,能够看作是一种比“雪崩”更轻微的故障,可是也会在一段时间内对系统形成冲击和性能影响。通常是因为缓存节点故障致使。业内推荐的作法是经过一致性Hash算法来解决。
程序猿面试交流社区:705127209
5、缓存的雪崩现象
缓存雪崩就是指因为缓存的缘由,致使大量请求到达后端数据库,从而致使数据库崩溃,整个系统崩溃,发生灾难。
致使这种现象的缘由有不少种,上面提到的“缓存并发”,“缓存穿透”,“缓存颠簸”等问题,其实均可能会致使缓存雪崩现象发生。这些问题也可能会被恶意攻击者所利用。
还有一种状况,例如某个时间点内,系统预加载的缓存周期性集中失效了,也可能会致使雪崩。为了不这种周期性失效,能够经过设置不一样的过时时间,来错开缓存过时,从而避免缓存集中失效。
从应用架构角度,咱们能够经过限流、降级、熔断等手段来下降影响,也能够经过多级缓存来避免这种灾难。
此外,从整个研发体系流程的角度,应该增强压力测试,尽可能模拟真实场景,尽早的暴露问题从而防范。
6、缓存无底洞现象
该问题由 facebook 的工做人员提出的, facebook 在 2010 年左右,memcached 节点就已经达3000 个,缓存数千 G 内容。
他们发现了一个问题---memcached 链接频率,效率降低了,因而加 memcached 节点,添加了后,发现由于链接频率致使的问题,仍然存在,并无好转,称之为”无底洞现象”。
目前主流的数据库、缓存、Nosql、搜索中间件等技术栈中,都支持“分片”技术,来知足“高性能、高并发、高可用、可扩展”等要求。
有些是在client端经过Hash取模(或一致性Hash)将值映射到不一样的实例上,有些是在client端经过范围取值的方式映射的。固然,也有些是在服务端进行的。
可是,每一次操做均可能须要和不一样节点进行网络通讯来完成,实例节点越多,则开销会越大,对性能影响就越大。
程序猿面试交流社区:705127209
主要能够从以下几个方面避免和优化:
一、数据分布方式
有些业务数据可能适合Hash分布,而有些业务适合采用范围分布,这样可以从必定程度避免网络IO的开销。
二、IO优化
能够充分利用链接池,NIO等技术来尽量下降链接开销,加强并发链接能力。
三、数据访问方式
一次性获取大的数据集,会比分屡次去获取小数据集的网络IO开销更小。
固然,缓存无底洞现象并不常见。在绝大多数的公司里可能根本不会遇到。