分布式缓存详解

1. 什么是缓存?

  • 缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取。由于缓存的数据比内存快的多,所以缓存的作用就是帮助硬件更快的运行。
  • 缓存往往使用的是RAM(断电既掉的非永久存储),所以在用完后还是会把文件送到硬盘等存储器中永久存储。电脑中最大缓存就是内存条,硬盘上也有16M或者32M的缓存。
  • 高速缓存是用来协调CPU与主存之间存取速度的差异而设置的。一般CPU工作速度高,但内存的工作速度相对较低,为了解决这个问题,通常使用高速缓存,高速缓存的存取速度介于CPU与主存之间。系统将一些CPU在最近几个时间段经常访问的内容存在高速缓存,这样就在一定程度上缓解了由于主存速度低造成的CPU“停工待料”的情况。
  • 缓存就是把一些外存上的数据保存在内存上而已,为什么保存在内存上,我们运行的所有程序里面的变量都是存放在内存中的,所以如果想将值放入内存上,可以通过变量的方式存储。在JAVA中一些缓存一般都是通过Map集合来实现的。

2. 缓存雪崩

缓存雪崩可以简单的理解为:由于原有缓存失效而新缓存未到,期间所有原本应该访问缓存的请求都对数据库进行查询处理,数据库CPU 和内存面临巨大压力。严重的情况会造成数据库宕机,从而形成一系列连锁反应,最终造成整个系统崩溃。

一般有三种处理缓存雪崩的办法:

  • 一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
  • 给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。
  • 为key 设置不同的缓存失效时间。

3. 缓存穿透

  • 缓存穿透是指用户查询的数据不在数据库中,自然也不在缓存里。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。
  • 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希放到一个足够大的bitmap 中。这样如果一个数据如果不存在,就会被bitmap 拦截掉,从而避免了对底层存储系统的查询压力。
  • 另外,有一个更为简单粗暴的方法。如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。通过直接设置默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。

4. 缓存预热

缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,再查询数据缓存的问题,用户就可以直接查询事先被预热的缓存数据。

5. 缓存更新

缓存更新除了缓存服务器自带的缓存失效策略之外(Redis 默认的有6 中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的淘汰策略有两种:

  • 定时去清理过期的缓存。
  • 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。

6. 缓存降级

  • 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。
  • 降级的最终目的是保证核心服务可用,即使是有损的,并且有些服务是无法降级的(如加入购物车、结算)。

你可能感兴趣的:(Redis)