缓存击穿、缓存失效及热点key的解决方案

  分布式缓存是网站服务端常常用到的一种技术,在读多写少的业务场景中,经过使用缓存能够有效地支撑高并发的访问量,对后端的数据库等数据源作到很好地保护。如今市面上有不少分布式缓存,好比Redis、Memcached以及阿里的Tair等,无论咱们使用的哪一种缓存产品,基本上都会遇到缓存击穿、缓存失效以及热点key的问题。如何有效地防止这些问题,也是咱们在享受缓存带来的红利的同时,必需要解决的难题。算法

  一般咱们在使用缓存时都是先检查缓存中是否存在,若是存在直接返回缓存内容,若是不存在就直接查询数据库而后再缓存查询结果返回,例以下图所示:数据库

缓存击穿:

描述

  查询一个数据库中不存在的数据,好比商品详情,查询一个不存在的ID,每次都会访问DB,若是有人恶意破坏,极可能直接对DB形成过大的压力。后端

解决方案:

  当经过某一个key去查询数据的时候,若是对应在数据库中的数据都不存在,咱们将此key对应的value设置为一个默认的值,好比“NULL”,并设置一个缓存的失效时间,这时在缓存失效以前,全部经过此key的访问都被缓存挡住了。后面若是此key对应的数据在DB中存在时,缓存失效以后,经过此key再去访问数据,就能拿到新的value了。缓存

缓存失效:

描述

  在高并发的环境下,若是此时key对应的缓存失效,此时有多个进程就会去同时去查询DB,而后再去同时设置缓存。这个时候若是这个key是系统中的热点key或者同时失效的数量比较多时,DB访问量会瞬间增大,形成过大的压力。并发

解决方案:

  将系统中key的缓存失效时间均匀地错开,防止统一时间点有大量的key对应的缓存失效;
  从新设计缓存的使用方式,当咱们经过key去查询数据时,首先查询缓存,若是此时缓存中查询不到,就经过分布式锁进行加锁,取得锁的线程查DB并设置缓存,而后解锁;其余线程若是发现有锁就等待,而后等解锁后返回缓存数据或者再次查询DB。分布式

热点key:

描述

  缓存中的某些Key(可能对应用与某个促销商品)对应的value存储在集群中一台机器,使得全部流量涌向同一机器,成为系统的瓶颈,该问题的挑战在于它没法经过增长机器容量来解决。高并发

解决方案:

  客户端热点key缓存:将热点key对应value并缓存在客户端本地,而且设置一个失效时间。对于每次读请求,将首先检查key是否存在于本地缓存中,若是存在则直接返回,若是不存在再去访问分布式缓存的机器。
将热点key分散为多个子key,而后存储到缓存集群的不一样机器上,这些子key对应的value都和热点key是同样的。当经过热点key去查询数据时,经过某种hash算法随机选择一个子key,而后再去访问缓存机器,将热点分散到了多个子key上。网站

相关文章
相关标签/搜索