zoukankan      html  css  js  c++  java
  • 缓存命中率

    缓存命中率

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

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

      通常来讲,缓存的命中率越高则表示使用缓存的收益越高,应用的性能越好(响应时间越短、吞吐量越高),抗并发的能力越强。由此可见,在高并发的互联网系统中,缓存的命中率是至关重要的指标。

    影响缓存命中率的几个因素(宏观)

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

    1.业务场景和业务需求

      缓存适合“读多写少”的业务场景,反之,使用缓存的意义其实并不大,命中率会很低。务需求决定了对时效性的要求,直接影响到缓存的过期时间和更新策略。时效性要求越低,就越适合缓存。在相同key和相同请求数的情况下,缓存时间越长,命中率会越高。互联网应用的大多数业务场景下都是很适合使用缓存的。

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

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

    当缓存单个对象的时候(例如:单个用户信息),只有当该对象对应的数据发生变化时,我们才需要更新缓存或者让移除缓存。而当缓存一个集合的时候(例如:所有用户数据),其中任何一个对象对应的数据发生变化时,都需要更新或移除缓存。还有另一种情况,假设其他地方也需要获取该对象对应的数据时(比如其他地方也需要获取单个用户信息),如果缓存的是单个对象,则可以直接命中缓存,反之,则无法直接命中。这样更加灵活,缓存命中率会更高。此外,缓存的更新/过期策略也直接影响到缓存的命中率。当数据发生变化时,直接更新缓存的值会比移除缓存(或者让缓存过期)的命中率更高,当然,系统复杂度也会更高。

    3.缓存容量和基础设施

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

    4.其他因素

    当缓存节点发生故障时,需要避免缓存失效并最大程度降低影响,这种特殊情况也是架构师需要考虑的。业内比较典型的做法就是通过一致性Hash算法,或者通过节点冗余的方式。有些朋友可能会有这样的理解误区:既然业务需求对数据时效性要求很高,而缓存时间又会影响到缓存命中率,那么系统就别使用缓存了。其实这忽略了一个重要因素--并发。通常来讲,在相同缓存时间和key的情况下,并发越高,缓存的收益会越高,即便缓存时间很短。

    影响缓存命中率的几个因素(微观)

    我们经常通过命中率来衡量缓存机制的好坏和效率,这个命中率指的就是请求缓存次数和缓存返回正确结果的次数的一个比例,这个比例越高,就表明缓存的使用率越高。

    正常的缓存命中率也会因为不同的缓存应用而大不相同,咱们以query cache为例来说明一下,经过服务器一段时间的运行和积累,query cache的命中率在98%以上,而另外的能在85%就算是很高了,这个跟我们的缓存机制的实现有关系,一般来说,越复杂的缓存机制,越难以保证命中率,随着系统的积累,缓存命中率会逐渐增长至稳定状态。我们需要注意的是,就是不要频繁的更新缓存数据,这样会降低命中率,如果不得不做的话,就得考虑缓存在这里是否合理了。

    缓存更新策略一般有以下三种:

    (1)FIFO(first in first out),也就是说,最先进入缓存的数据,在缓存空间不够的情况下,将会被先清除
    (2)LFU(less frequently used),这里是说,最少使用的元素会先被清理,这里需要标记元素使用情况
    (3)LRU(least recently used),这个说的是最近最少使用的元素会先被清理,需给元素标记时间戳,距离当前时间最远的元素,将会先被清理
    缓存最大数据量是指在缓存中能处理元素的最大个数或者说所能使用的最大空间。通常来讲,各种缓存机制都会对缓存的最大数据量进行限制,可以是固定大小的存储空间、集合个数,或者是由操作系统所能处理和分配的存储空间决定。而超过缓存机制所允许的最大数据量,系统会进行相应的处理,一般有四种处理方式:

    (1)停止缓存服务,把所有的缓存数据清空
    (2)拒绝写入,不再对缓存数据进行更新
    (3)根据缓存更新策略,清除旧数据
    (4)在第三点的基础上,将淘汰的数据备份,腾出新的空间

    提高缓存命中率的方法

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

  • 相关阅读:
    图论一角
    入门-k8s部署应用 (三)
    入门-k8s集群环境搭建(二)
    入门-Kubernetes概述 (一)
    shell中获取时间
    Linux shell脚本之 if条件判断 (转)
    linux中shell变量$#等的释义
    shell 的here document 用法 (cat << EOF) (转)
    Homebrew的安装与使用
    docker容器编排 (4)
  • 原文地址:https://www.cnblogs.com/chihaoyuIsnotHere/p/11383487.html
Copyright © 2011-2022 走看看