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分配