跳转至

缓存基础知识

参考:缓存那些事 - 美团技术团队

背景

应用需要更多的并发量,同时应用服务器和数据库服务器所做的计算越来越多,但是服务器资源有限,文件的读写也是有限的。

引入缓存,可以有效利用有限的资源来提供尽可能大的吞吐量

每个环节请求可以从缓存中直接获取目标数据并返回,从而减少计算量,有效提升响应速度,让有限的资源服务更多的用户

缓存的使用可以出现在1~4的各个环节中,每个环节的缓存方案与使用各有特点。

缓存特征

命中率

返回正确结果数/请求缓存次数

命中率越高,表明缓存的使用率越高

最大元素(或最大空间)

缓存中可以存放的最大元素的数量,一旦缓存中元素数量超过这个值,那么将会触发缓存启动清空策略根据不同的场景合理地设置最大元素值往往可以一定程度上提高缓存的命中率,从而更有效地使用缓存

清空策略

当缓存空间被占用满时,如何保证在稳定服务的同时有效提高命中率,这就由缓存清空策略来处理,设计适合自身数据特征的清空策略能有效提升命中率,常见的一般策略有:

l FIFO:先进先出策略,主要比较缓存元素的创建时间,在数据实效性要求场景下可选择该类策略,优先保障最新数据可用。

l LFU(Less Frequently Used):最少使用策略,无论是否过期,根据元素的被使用次数判断,清除使用次数较少的元素释放空间。策略算法主要比较元素的hitCount(命中次数)。在保证高频数据有效性场景下,可选择此类策略。

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

缓存介质

l 内存:最快,但是没有持久化落地物理磁盘,一旦应用break down而重新启动,数据很难或者无法复原

l 硬盘:一般来说,很多缓存框架会结合适用内存和硬盘,在内存分配空间满了或是在异常的情况下,可以被动或主动地将内存空间数据持久化到硬盘中,达到释放空间或备份数据的目的

l 数据库:增加缓存的策略的目的之一就是为了减少数据库的I/O压力,只是简单的key-value存储结构的特殊数据库(如Redis等),响应速度和吞吐量都远远高于我们常用的关系型数据库等

缓存分类和应用场景

本地缓存

指的是在应用中的缓存组件,其最大的优点是应用和cache是在同一个进程内部,请求缓存非常快速,没有过多的网络开销等,在单应用不需要集群支持或者集群情况下各节点无需互相通知的场景下使用本地缓存较合适;同时,它的优点也是因为缓存跟应用程序耦合,多个应用程序无法直接共享缓存,各应用或集群的各节点都需要维护自己的单独缓存,对内存是一种浪费。

分布式缓存

指的是与应用分离的缓存组件或服务,其最大的优点是自身就是一个独立的应用,与本地应用隔离,多个应用可直接共享缓存

memcached是应用较广的开源分布式缓存产品之一,它本身其实不提供分布式解决方案。在服务端,memcached集群环境实际就是一个个memcached服务器的堆积,环境搭建较为简单;cache的分布式主要是在客户端实现,通过客户端的路由处理来达到分布式解决方案的目的。

客户端做路由的原理非常简单,应用服务器在每次存取某key的value时,通过某种算法把key映射到某台memcached服务器nodeA上,因此这个key所有操作都在nodeA上

缓存实战