ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
# memcached [TOC] ## 一、memcached基础 ### 1. 基础概念 官网:http://memcached.org/ 开源的,支持高性能、高并发的分布式内存缓存系统,是一套仅利用系统内存进行数据缓存的软件,一种非关系型数据库。 原理是通过在实现规划好的系统内存空间中临时缓存数据库中的各类数据,以达到减少前端业务服务对数据库的直接高并发访问,从而提升大规模网站集群中动态服务的并发访问能力。 在企业中的用途: * 作为数据库的查询数据缓存。 * 作为集群节点的session会话共享。 ### 2. 常见缓存服务软件对比 1. memcached 纯内存型,常用于缓存网站后端各类数据 2. redis、memcachedb 内存型,但可持久化存储,还能作为关系型数据库的重要补充 3. squid、nginx 内存、内存加磁盘,主要用户缓存web前端的服务内容,CDN公司的选择 ### 3. 工作流程 当程序需要访问后端数据库提取数据时,会先访问memcached缓存,如果缓存中数据就直接返回给用户,如果没有数据再去访问数据库,并且可以在访问数据库得到数据后,将数据存储到缓存中,则下次这些数据再被访问时,就不需要调用数据库了。 如果数据中的数据更新或删除,也要通告memcached,需要保证缓存和数据库中的数据一致、数据库访问缓存数据怎么写入缓存,需要由开发人员开发的程序控制。 ![mark](http://noah-pic.oss-cn-chengdu.aliyuncs.com/pic/20200308/193617655.png) ### 4. memcached特点 * 协议简单,基于文本行的协议,通过telnet、nc等命令都能操作里面的数据 * 支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制。 * 采用key/vaule键值对数据类型 * 全内存缓存,效率高。无持久化设计,重启系统或服务,数据会丢失 * 通过LRU算法删除过期的缓存数据,采用SLAB内存分配机制 * 可支持分布式集群,通过web端程序或一致性hash算法等,让每个节点独立存储数据,集群服务器之间互不通信 ### 5. 检测过期与删除机制 * 采用懒惰检测机制。 不主动检测item对象是否过期,而是在进行get操作的时候检测item对象是否过期以及是否删除。 * 采用懒惰删除对象机制。 当对象要删除时,仅仅做删除标记,下次分配时直接使用,一般不会释放内存空间。 * 当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除 * 数据存入可以设定过期时间,但过期后不会立即删除,懒惰检测机制 * 如果不希望使用LRU算法,使用适用-M参数 ## 二、memcached内存管理 ### 1. slab内存管理机制流程 * 提前将大内存分配大小为1MB的若干个slab,然后针对每个slab再进行chunk填充,避免大量重复的初始化和清理,减去内存管理器的负担。 * 相同尺寸的内存块(chunk)组成组(chunks slab class),这些内存块不会释放,可以重复利用 * 新增数时,根据slab内空闲的chunk列表,以及接受到的数据大小,选择最合适数据大小的slab分配一个能存下这个数据的最小内存块(chunk),内存不会释放而是重复利用。 ### 2. salb术语 * slab calss 内存区类别(48byte-1MB) * slab 动态穿件的实际内存区,即分配给slab的内存空间,默认1MB * slab classid slab class的ID * chunk 数据区块,固定大小,chunk初始大小48bytes,相当于block * item 实际存储在chunk的数据项 ### 3. slab内存管理机制特点 * 提前分配大内存slab,在进行小对象填充chunk * 避免大量重复的初始化和清理,减轻内存管理器的负担 * 避免频繁malloc/free内存分配导致的碎片 * chunk相当于block,但是chunk只在同一个slab class中才是相同大小的 ### 4. slab的缺点 * chunk存储item浪费空间 * slab尾部空间剩余 * 可以在启动memcached时指定增长因子(-f选项)来控制每组slab之间的差异 ## 三、企业场景 ### 1. 常规架构 ![mark](http://noah-pic.oss-cn-chengdu.aliyuncs.com/pic/20200308/193626993.png) ### 2. session会话共享 ![mark](http://noah-pic.oss-cn-chengdu.aliyuncs.com/pic/20200308/193634300.png)