zoukankan      html  css  js  c++  java
  • 三、内存型缓存Memcached

     Memcached是应用最为广泛的缓存组件,下面我们根据上面的知识图谱来简单学学Memcached。

    1、Memcached基本介绍

    • Memcached是内存组件,所有缓存数据都存放在内存中,不支持持久化到硬盘,所以Memcached读取效率很高,Memcached 单机压测能达到百万级QPS,但是如果发生系统重启或崩溃会导致缓存丢失。

    • 其次Memcached开源的key/value内存缓存系统,nosql存储组件。而且Memcached的value 直接以二进制方式存储,不识别内部存储结构,只支持字符串类型,所以Memcached的访问协议也很简单,只有get、set、cas、touch等几个有限的命令。下面会详细解释Memcached的操作命令。(NoSQL 即 Not SQL,泛指非关系型数据存储。NoSQL 是通过聚合模型来进行数据处理的。其聚合模型主要分为:key/value 键值对、列族、图形等几种方式。) 

    • Memcached是基于内存操作的,存储空间有限,所以只做热数据缓存,当有新key进入时,如果没有空闲的内存空间,就会使用LRU对不活跃的key或是过期的key进行剔除。

    • 最后,Memcached服务很简单,只单一的处理了单机数据的存储、读取和剔除,不关心外部操作,节点间互不通信,所以在应对互联网高并发、大数据等环境,单机Memcached不能满足业务需要的时候,我们需要使用额外的组件负责管理Memcached集群内数据的分布。

    2、Memcached命令详解

     

     详细可参考 https://www.runoob.com/memcached/memcached-add-data.html

     

    3、memcached常用客户端

      Mc 在互联网企业应用广泛,热门语言基本都有 Mc client 的实现。以 Java 语言为例,互联网业界广泛使用的有 Memcached-Java-Client、SpyMemcached、Xmemcached 等。

      Memcached-Java-Client 推出时间早,10 年前就被广泛使用,这个 client 性能一般,但足够稳定,很多互联网企业至今仍在使用。不过这个 client 几年前就停止了更新。

      SpyMemcached 出现的比较晚,性能较好,但高并发访问场景,稳定性欠缺。近几年变更很少,基本停止了更新。

         Xmemcached 性能较好,综合表现最佳。而且社区活跃度高,近些年也一直在持续更新中。Java 新项目启动,推荐使用 Xmemcached。 

      在使用 Mc client 时,有一些通用性的调优及改进方案。比如,如果读写的 key/value 较大,需要设置更大的缓冲 buf,以提高性能。在一些业务场景中,需要启用 TCP_NODELAY,避免 40ms 的延迟问题。同时,如果存取的 key/value size 较大,可以设置一个压缩阀值,超过阀值,就对value 进行压缩算法,减少读写及存储的空间。

      为了避免缓存雪崩,并更好地应对极热 key 及洪水流量的问题,还可以对 Mc client 进行封装,加入多副本、多层级策略,使 Mc 缓存系统在任何场景下,都可做到高可用、高性能

    4、memcached 淘汰冷key和时效key

     5、RLU淘汰策略

    6、memcached 写入流程

    7、memcached 定位key

    8、Memcached命令处理流程

      对于的命令处理,Memcached基于libevent实现多线程IO模型。使用状态机来根据8种状态执行指定函数来,主线程和工作线程协同工作。

      主要处理流程如下:

    • 主线程始终处于监听状态,监听请求,接收新连接接入,同时将新接入的连接放入连接队列
    • 主线程轮询选择一个工作线程,并向工作线程发送通知。
    • 工作线程监听到主线程的通知后开始从新连接队列获得一个连接,然后开始读取这个连接的网络io并处理
    • 工作线程读取IO网络数据,根据MC协议解析指令放入buf缓冲区中
    • 状态机拿到缓冲区中的指令根据switch case选择对应函数执行执行
      • 如果是读取类型协议,直接读取value并将执行结果写入rbuf结果缓冲区
      • 如果是更新类型协议,则先去读取内容,在进行变更操作
    • 工作线程执行完以上操作后会将结果响应给客户端,然后再次进入连接重置状态,等待下一次循环
    • 在整个指令处理流程,读取、解析,处理,响应,任何失败都会导致连接关闭。

    9、Memcached 内存模型

    10、Memcached  slab分配

  • 相关阅读:
    python 3 dict函数 神奇的参数规则
    python 3 黑色魔法元类初探
    私有变量为何传给了子类?
    [转]django-registration quickstart
    DoesNotExist at /account/
    DoesNotExist at /admin/
    setting.py
    Python excel 奇怪的通信规则
    Python 一个奇特的引用设定
    Chrome 内存和CPU消耗量双料冠军
  • 原文地址:https://www.cnblogs.com/tianhaichao/p/12312028.html
Copyright © 2011-2022 走看看