共计 1654 个字符,预计需要花费 5 分钟才能阅读完成。
—————————————- 概述 —————————————-
Memcached 是一套高性能分布式内存对象缓存服务器。它将所有的数据统统保存在内存中,在内存中会维护一个巨大的 hash 表,支持任意存储类型的数据,很多网站通过 Memcached 提高网站的访问速度,尤其是对于大型的需要频繁访问的网站,减少查询效率,提高查询速度
—————————————- 架构 —————————————-
C/ S 架构:
服务端:Memcached 服务端,通过 C 语言编写而成
客户端:Memcached API 客户端,可以通过任何语言编写,如 php、py 等
特点:
1. 为了提高性能,memcached 中保存的数据都存储在 memcached 内置的内存空间中:由于数据仅存在于内存中,因此重启 memcached、重启操作系统会导致全部数据消失
2. 基于 libevent 的事件处理:libevent 是个程序库,它将 Linux 的 epoll、BSD 类操作系统的 kqueue 等事件处理功能封装成统一的接口;即使对服务器的连接数增加,也能发挥 O(1) 的性能;memcached 使用这个 libevent 库,因此能在 Linux、BSD、Solaris 等操作系统上发挥其高性能
3. 简单 key/value 存储:服务器不关心数据本身的意义及结构,只要是可序列化数据即可;存储项由“键、过期时间、可选的标志及数据”四个部分组成
4. 功能的实现一半依赖于客户端,一半基于服务器端:客户负责发送存储项至服务器端、从服务端获取数据以及无法连接至服务器时采用相应的动作;服务端负责接收、存储数据,并负责数据项的超时过期
—————————————- 缓存策略 —————————————-
Slab Allocator 机制基本原理:
按照预先规定的大小,将分配的内存分割成特定长度的块 chunk,并把尺寸相同的块分成组,以完全解决内存碎片问题。但由于分配的是特定长度的内存,因此无法有效利用分配的内存。比如将 100 字节的数据缓存到 128 字节的 chunk 中,剩余的 28 字节就浪费了;按照预先规定的大小,将分配的内存分割成特定长度的内存块 chunk,再把尺寸相同的内存块分层组 chunk 集合,这些内存不会释放,可以反复利用
Slab Allocation 机制角色:
1.chunk 为固定大小的内存空间,默认为 96Byte
2.page 对应实际的物理空间,1 个 page 为 1M
3. 同样大小的 chunk 集合又称为 slab
客户端选择 slab 机制:
下面说明 memcached 如何针对客户端发送的数据选择 slab 并缓存到 chunk 中;memcached 根据收到的数据的大小,选择最适合数据大小的 slab;memcached 中保存着 slab 内空闲 chunk 的列表,根据该列表选择 chunk,然后将数据缓存于其中
内存释放机制:
Laxzy Expiration:
Memcached 每个被存取的对象都有唯一的标识符 key,存取操作均通过 key 进行,例如可以把后端数据库中的 select 操作提取出来,然后对相应的 SQL 进行 hash 计算得出 key,然后以这个 key 在 memcached 中查找数据,如果数据不存在,说明其尚未被写入缓存中,并设置一个失效时间(比如 1 小时),在失效时间内的数据都是从缓存中提取,这样就有效地减少了数据库的压力
Least Recently Used(LRU):
删除“最近最少使用”的记录的机制;当 memcached 的内存空间不足时,从最近未被使用的记录中搜索,并将其空间分配给新的记录;-M 参数禁止 LRU 功能,内存用尽时,memcached 会返回错误,不建议使用 memcached -M -m 1024
: