分布式系统缓存系列一 认识缓存

 

一、缓存的意义

   说到分布式系统基本上就离不开缓存,在高并发,大流量的场景下缓存更是扮演着重要的角色。因此做为一个分布式系统的开发人员是必须熟练掌握缓存的使用与设计。下面是一张简单的系统架构图redis

 分布式系统架构

       从图中咱们知道了缓存在系统层面的所处位置,能够在应用系统的内部也能够在外部。那缓存的意义又是什么呢?算法

       一、缩短系统的响应时间,提高用户体验。若是在系统的内部就已经缓存有了用户请求所须要的结果,那么就不在须要执行其后面操做如外部RPC,DB查询,直接返回结果,给用户流畅般的系统体验。缓存

      二、扛住更大的流量,保护关键系统组件。举个例子在高并发,大流量的场景下若是没有缓存的保护,全部的请求的都直接穿透到咱们底层的DB。DB基本上都是扛不住的,DB一旦宕机基本上整个系统就over了,但不少缓存中间件好比redis,memcache却能够扛得住。架构

      三、提高系统稳定性,提升总体吞吐量。第三点其实由前面两点总结出来的。     并发

 

 

二、缓存的分类

   根据缓存的存储状况能够分为:集中式缓存,本地缓存,分布式缓存。less

 

    集中式缓存:全部的缓存都统一在一个地方管理。分布式

    优势:数据集中容易管理,一致性好,实时性好,只要修改一处地方能够当即看到效果。高并发

    缺点:集中式缓存一般都存放在系统的外部,高并发请求下带宽很容易成为瓶颈。性能

    优化:减小没必要要的数据,只存储真正须要的数据。对放进缓存的数据进行压缩,取出来以后再进行解压。目的都是为了减小数据传输对带完的占用。优化

 

    本地缓存:又叫localCache,每一个应用的本地都留着一份完整的缓存副本。

    优势:性能好,相对于集中式缓存不须要访问外部而且没有带宽的压力。

    缺点:数据分散,不容易管理。数据一致性差,多个副本之间数据同步有延时。

    优化:必须给本地缓存加上一个过时失效时间,而且创建一套相对实时数据更新机制,保证副本的数据可以有效及时更新。

 

    分布式缓存:以集群的方式搭建缓存,好比redis集群。

    优势:高性能,支持动态扩展,支持高可用

    分布式缓存集群都是以分片的形式数据分散到多台机器上面去存储,分片的形式有客户端分片(memcahed),服务端分片(redis),分片用的hash算法一般采用一致性hash。这一块涉及的内容比较多,有时间的话后面打算专门独立讨论。    

 

三、缓存的特征

   缓存也是一个数据模型对象,那么必然有它的一些特征:

   命中率

   命中率=返回正确结果数/请求缓存次数,命中率问题是缓存中的一个很是重要的问题,它是衡量缓存有效性的重要指标。命中率越高,代表缓存的使用率越高。

   最大元素(或最大空间)

  缓存中能够存放的最大元素的数量,一旦缓存中元素数量超过这个值(或者缓存数据所占空间超过其最大支持空间),那么将会触发缓存启动清空策略根据不一样的场景合理的设置最大元素值每每能够必定程度上提升缓存的命中率,从而更有效的时候缓存。

四、缓存的清空策略

如上描述,缓存的存储空间有限制,当缓存空间被用满时,如何保证在稳定服务的同时有效提高命中率?这就由缓存清空策略来处理,设计适合自身数据特征的清空策略能有效提高命中率。常见的通常策略有:

  • FIFO(first in first out)

    先进先出策略,最早进入缓存的数据在缓存空间不够的状况下(超出最大元素限制)会被优先被清除掉,以腾出新的空间接受新的数据。策略算法主要比较缓存元素的建立时间。在数据实效性要求场景下可选择该类策略,优先保障最新数据可用。

  • LFU(less frequently used)

    最少使用策略,不管是否过时,根据元素的被使用次数判断,清除使用次数较少的元素释放空间。策略算法主要比较元素的hitCount(命中次数)。在保证高频数据有效性场景下,可选择这类策略。

  • LRU(least recently used)

    最近最少使用策略,不管是否过时,根据元素最后一次被使用的时间戳,清除最远使用时间戳的元素释放空间。策略算法主要比较元素最近一次被get使用时间。在热点数据场景下较适用,优先保证热点数据的有效性。

除此以外,还有一些简单策略好比:

  • 根据过时时间判断,清理过时时间最长的元素;
  • 根据过时时间判断,清理最近要过时的元素;
  • 随机清理;
  • 根据关键字(或元素内容)长短清理等。
相关文章
相关标签/搜索