如何提升缓存命中率

缓存命中率的介绍

命中:能够直接经过缓存获取到须要的数据。redis

不命中:没法直接经过缓存获取到想要的数据,须要再次查询数据库或者执行其它的操做。缘由多是因为缓存中根本不存在,或者缓存已通过期。算法

一般来说,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。数据库

因而可知,在高并发的互联网系统中,缓存的命中率是相当重要的指标。缓存

如何监控缓存的命中率

在memcached中,运行state命令能够查看memcached服务的状态信息,其中cmd_get表示总的get次数,get_hits表示get的总命中次数,命中率 = get_hits/cmd_get。架构

固然,咱们也能够经过一些开源的第三方工具对整个memcached集群进行监控,显示会更直观。比较典型的包括:zabbixMemAdmin等。并发

 

如图:MemAdmin对memcached服务的命中率状况的监控统计框架

 

同理,在redis中能够运行info命令查看redis服务的状态信息,其中keyspace_hits为总的命中中次数,keyspace_misses为总的miss次数,命中率=keyspace_hits/(keyspace_hits+keyspace_misses)。分布式

开源工具Redis-star能以图表方式直观redis服务相关信息,同时,zabbix也提供了相关的插件对redis服务进行监控。memcached

影响缓存命中率的几个因素

以前的章节中咱们提到了缓存命中率的重要性,下面分析下影响缓存命中率的几个因素。高并发

  1. 业务场景和业务需求

缓存适合“读多写少”的业务场景,反之,使用缓存的意义其实并不大,命中率会很低。

业务需求决定了对时效性的要求,直接影响到缓存的过时时间和更新策略。时效性要求越低,就越适合缓存。在相同key和相同请求数的状况下,缓存时间越长,命中率会越高。

互联网应用的大多数业务场景下都是很适合使用缓存的。

  1. 缓存的设计(粒度和策略)

一般状况下,缓存的粒度越小,命中率会越高。举个实际的例子说明:

当缓存单个对象的时候(例如:单个用户信息),只有当该对象对应的数据发生变化时,咱们才须要更新缓存或者让移除缓存。而当缓存一个集合的时候(例如:全部用户数据),其中任何一个对象对应的数据发生变化时,都须要更新或移除缓存。

还有另外一种状况,假设其余地方也须要获取该对象对应的数据时(好比其余地方也须要获取单个用户信息),若是缓存的是单个对象,则能够直接命中缓存,反之,则没法直接命中。这样更加灵活,缓存命中率会更高。

此外,缓存的更新/过时策略也直接影响到缓存的命中率。当数据发生变化时,直接更新缓存的值会比移除缓存(或者让缓存过时)的命中率更高,固然,系统复杂度也会更高。

  1. 缓存容量和基础设施

缓存的容量有限,则容易引发缓存失效和被淘汰(目前多数的缓存框架或中间件都采用了LRU算法)。同时,缓存的技术选型也是相当重要的,好比采用应用内置的本地缓存就比较容易出现单机瓶颈,而采用分布式缓存则毕竟容易扩展。因此须要作好系统容量规划,并考虑是否可扩展。此外,不一样的缓存框架或中间件,其效率和稳定性也是存在差别的。

  1. 其余因素

当缓存节点发生故障时,须要避免缓存失效并最大程度下降影响,这种特殊状况也是架构师须要考虑的。业内比较典型的作法就是经过一致性Hash算法,或者经过节点冗余的方式。

 

有些朋友可能会有这样的理解误区:既然业务需求对数据时效性要求很高,而缓存时间又会影响到缓存命中率,那么系统就别使用缓存了。其实这忽略了一个重要因素--并发。一般来说,在相同缓存时间和key的状况下,并发越高,缓存的收益会越高,即使缓存时间很短。

 

提升缓存命中率的方法

从架构师的角度,须要应用尽量的经过缓存直接获取数据,并避免缓存失效。这也是比较考验架构师能力的,须要在业务需求,缓存粒度,缓存策略,技术选型等各个方面去通盘考虑并作权衡。尽量的聚焦在高频访问且时效性要求不高的热点业务上,经过缓存预加载(预热)、增长存储容量、调整缓存粒度、更新缓存等手段来提升命中率。

对于时效性很高(或缓存空间有限),内容跨度很大(或访问很随机),而且访问量不高的应用来讲缓存命中率可能长期很低,可能预热后的缓存还没来得被访问就已通过期了。

 

缓存的失效和更新策略也是很是重要的,下篇继续...

相关文章
相关标签/搜索