memcached文档

memcached文档

memcached介绍

Memcached 是国外 社区 网站 LiveJournal 的开发团队开发的 高性能的分布式内 
存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访 
问次数,以提高动态 Web 应用的速度、提高可扩展性

基于 libevent 的事件处理

libevent 是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统: 
Windows/Linux/BSD/Solaris 等操作系统的的事件处理。 
包装的接口包括: 
poll 、 select(Windows) 、 epoll(Linux) 、 kqueue(BSD) 、 /dev/pool(Solaris) 
Memcached 使用 libevent 来进行网络并发连接的处理,能够保持在很大并发情 
况下,仍旧能够保持快速的响应能力。

Memcached 的主要特点

  • 基于 C/S 架构, 协议简单
  • 基于 libevent 的事件处理
  • 自主内存存储处理
  • 基于客户端的 Memcached

自主的内存存储处理

  • 数据 存储方式: Slab Allocation
  • 数据 过期 方式: Lazy Expiration + LRU

数据存储方式: Slab Allocation

Slab Allocator 的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。 
Slab Allocation 的原理相当简单。 将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的块分成组(chunk 的集合)

Page : 分配给 Slab 的内存空间,默认是1MB 。分配给 Slab 之后根据 slab 的大小 
切分成 chunk 。

Chunk : 用于缓存记录的内存空。

Slab Class : 特定大小的 chunk 的组。

memcached 根据收到的数据的大小,选择最适合数据大小的 slab 。

memcached 中保存着 slab 内空闲 chunk 的列表,根据该列表选择 chunk ,然后将数据缓存于其中。

Slab Alloction 缺点

这个问题就是,由于分配的是特定长度的内存,因此无法有效利用分配的内存。例如,将 100 字节的数据缓存到 128 字节的 chunk 中,剩余的 28 字节就浪费了

数据过期方式

  • Lazy Expiration

memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期。这种技术被称为 lazy (惰性) expiration 。因此, memcached 不会在过期监视上耗费CPU 时间。

  • LRU

memcached 会优先使用已超时的记录的空间,但即使如此,也会发生追加新记录时空间不足的情况,此时就要使用名为 Least Recently Used ( LRU )机制来分配空间。顾名思义,这是删除 “ 最近最少使用 ” 的记录的机制。因此,当 memcached 的内存空间不足时(无法从 slab class 获取到新的空间时),就从最近未被使用的记录中搜索,并将其空间分配给新的记录。从缓存的实用角度来看,该模型十分理想。

memcached语法

命令:
统计类:stats, stats items, stats slabs, stats sizes
存储类:set, add, replace, append, prepend
命令格式:<command name> <key> <flags> <exptime> <bytes>  <cas unique>
检索类:get, delete, incr/decr
清空:flush_all

示例:
telnet> add KEY <flags> <expiretime> <bytes> \r
telnet> VALUE


-p <num> 监听的 TCP 端口 ( ( 缺省 : 11211)
-d 以守护进程方式运行 Memcached
-u <username> 运行 Memcached 的账户,非 root 用户
-m <num> 最大的内存使用,  单位是 MB , 缺省是  64 MB
-c <num> 软连接数量,  缺省是  1024
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息
-h 打印帮助信息
-i 打印 memcached 和 libevent
-M:内存耗尽时,不执行LRU清理缓存,而是拒绝存入新的缓存项,直到有多余的空间可用时为止;
-f <factor>:增长因子;默认是1.25;
-t <threads>:启动的用于响应用户请求的线程数
-U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.


memcached默认没有认证机制,可借用于SASL进行认证;
SASL:Simple Authentication Secure Layer



启动
systemctl start memcached

连接
telnet localhost 11211

Memcached 一些特性和限制

  • 在 Memcached 中可以保存的 item 数据量是没有限制的,只有内存足够
  • Memcached 单进程最大使用内存为 2G ,要使用更多内存,可以分多个端口开启多个 Memcached 进程
  • 最大 30 天的数据过期时间, 设置为永久的也会在这个时间过期,常量 REALTIME_MAXDELTA 60* * 60* * 24* * 30 控制

  • 最大键长为 250 字节,大于该长度无法存储,常量 KEY_MAX_LENGTH 250 控制

  • 单个 item 最大数据是 1MB ,超过 1MB 数据不予存储,常量 POWER_BLOCK 1048576 进行控制,它是默认的 slab 大小

  • 最大同时连接数是 200 ,通过 conn_init() 中的 freetotal 进行控制,最大软连接数是 1024 ,通过settings.maxconns=1024 进行控制

  • 跟空间占用相关的参数: settings.factor=1.25, settings.chunk_size=48, 影响 slab
  • 调优slab 比如memcached -f 1.5 -vv
tags: PHP,Memcache