缓存命中率的介绍

命中:可以直接通过缓存获取到需要的数据。

不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作。原因可能是由于缓存中根本不存在,或者缓存已经过期。

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

由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。

如何监控缓存的命中率

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

当然,我们也可以通过一些开源的第三方工具对整个memcached集群进行监控,显示会更直观。比较典型的包括:zabbix、MemAdmin等。

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

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

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

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

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

  1. 业务场景和业务需求

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

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

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

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

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

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

还有另一种情况,假设其他地方也需要获取该对象对应的数据时(比如其他地方也需要获取单个用户信息),如果缓存的是单个对象,则可以直接命中缓存,反之,则无法直接命中。这样更加灵活,缓存命中率会更高。

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

  1. 缓存容量和基础设施

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

  1. 其他因素

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

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

提高缓存命中率的方法

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

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

memcached 缓存命中率相关推荐

  1. 关于缓存命中率的几个关键问题!

    一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...

  2. shell 实现memcache缓存命中率监控脚本

    公司有几个服务器开着多个memcached进程,除了要监控他们是否正常telnet通,实例是否存在外还要监控他们的缓存命中率.针对他们的缓存命中率进行报警. 网上有个perl写的,需要编译安装.有个p ...

  3. PHP提高redis命中率,怎么提高redis缓存命中率

    缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...

  4. memcache 缓存命中率   状态查询

    memcache的运行状态可以方便的用stats命令显示. 首先用telnet 127.0.0.1 11211这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache的状 ...

  5. 理解Memcached缓存[转载]

    本文讨论了使用Memcached时,到底要缓存什么的问题,值得深入讨论,与大家共享. 最近公司一直在招人,我作为主考官之一 .经常会提问的一个问题,就是让用户介绍自己在缓存方面的经验和心得.绝大多数的 ...

  6. 4个影响缓存命中率的因素,你知道几个?

    一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...

  7. 深入探讨Varnish缓存命中率

    也许你还在为刚才动态内容获得7336.76 reqs/s的吞吐率感到振奋,等等,理想和现实是有差距的,你要忍受现实的残酷,别忘了,我们压力测试中的动态内容都处于全缓存情况下,也就是每次请求都命中缓存, ...

  8. mysql 加快命中_合理配置MySQL缓存 提高缓存命中率

    众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...

  9. 合理配置MySQL缓存 提高缓存命中率

    众所周知,系统读取数据时,从内存中读取要比从硬盘上速度要快好几百倍.故现在绝大部分应用系统,都会最大程度的使用缓存(内存中的一个存储区域),来提高系统的运行效率.MySQL数据库也不例外.在这里,笔者 ...

最新文章

  1. 英特尔蚕食AMD和NVIDIA?
  2. Swift:如何判断一个对象是否是某个类(或其子类)的实例
  3. 使用IAR开发CC2530遇到的两个问题
  4. Python多篇新闻自动采集
  5. python实现etl_为什么选择R而不是Python做ETL
  6. linux 设备驱动总结,linux设备驱动归纳总结(三):3面向对象思想和lseek
  7. 信息学奥赛一本通(1105:数组逆序重存放)
  8. wordpress模板-响应式博客主题模板-Repay主题开源版
  9. Android 重写onBackPressed()方法 不执行问题
  10. 2017.2.10自测(noip2002)
  11. java 数组 源码_Java数组转List的三种方式及对比
  12. Flask 蓝图(Blueprint)
  13. Weblogic下载安装以及部署
  14. 易优CMS插件大全-采集翻译发布插件
  15. js颜色RGB转十六进制
  16. HTML播放华为云视频流,华为云点播服务视频管理功能强大,上云就是省心
  17. 谷歌“隐私沙盒”引争议,广告业务与用户隐私难平衡?
  18. 如何判断横屏还是竖屏?
  19. win2d 画出好看的图形
  20. Keystone基本命令

热门文章

  1. 基于php的大学生四六级英语情况管理系统
  2. Avrora学习笔记(官网)
  3. 孟岩:感恩侯捷,遇高人不可交臂而失之
  4. 简易windows10快速关机bat脚本
  5. linux基础操作手册
  6. 【华为机试真题 Python实现】报数游戏
  7. 2022年首届天府杯数学建模国际大赛-问题C: E-Commerce Product Sales Forecast电子商务产品销售预测思路详解
  8. Mysql中内部包含函数
  9. 自动化电气工程师c语言,我是电气工程及其自动化专业的要学C语言吗?
  10. REST风格详解(很多其他人经验总结加上我自己的归纳到一起了,从推出到使用)