本文将介绍 Memcached 的简介,安装,特点,常用命令,工作原理,内存管理机制以及缓存策略等。

1. 什么是 Memcached

Memcached 是一个自由、源码开放、高性能、分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。 Memcached 是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的 key-value 存储,数据可以来自数据库调用、API 调用,或者页面渲染的结果。

2. Memcached 特点

协议简单:Memcached 的服务器客户端通信并不使用复杂的MXL等格式,而是使用简单的基于文本的协议。
基于 libevent 的事件处理:libevent是个程序库,将 Linux 的 epoll、BSD 类操作系统的 kqueue 等时间处理功能封装成统一的接口。Memcached 使用这个 libevent 库,因此能在 Linux、BSD、Solaris 等操作系统上发挥其高性能。
内置内存存储方式:为了提高性能,Memcached 中保存的数据都存储在 Memcached 内置的内存存储空间中。由于数据仅存在于内存中,因此重启 Memcached,重启操作系统会导致全部数据消失。另外,内容容量达到指定的值之后 Memcached 回自动删除不适用的缓存。
Memcached 不互通信的分布式:Memcached 尽管是“分布式”缓存服务器,但服务器端并没有分布式功能。各个 Memcached 不会互相通信以共享信息。他的分布式主要是通过客户端实现的。

3. Memcached–安装

在 Centos7 环境上安装:
3.1 执行以下命令,安装 Memcached:

1
yum install memcached

3.2 设置 Memcached 开机启动:

1
chkconfig memcached on

3.3 启动 Memcached:

1
service memcached start

3.4 查看 Memcached 运行状态:

1
ps -ef |grep memcached

安装和配置成功后,如下图:

hash_1

4. 连接 Memcached 和常用命令

Memcached 通过telnet命令来连接,包含setaddreplacegetdelete五种基本常用命令。

4.1 连接和退出

通过telnet命令,指定主机 ip 和端口来连接 Memcached 服务:

1
2
3
4
5
telnet 127.0.0.1 11211 //连接Memcached
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
quit //退出

4.2 set 命令

set 命令用于将 value (数据值) 存储在指定的 key(键) 中;如果 set 的 key 已经存在,该命令可以更新该 key 所对应的原来的数据,也就是实现更新的作用。
基本语法格式如下:

1
2
set key flags exptime bytes [noreply]
value

参数说明如下:
key:键值 key-value 结构中的 key,用于查找缓存值。
flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes:在缓存中存储的字节数
noreply(可选): 该参数告知服务器不需要返回数据
value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)。
实例如下:

1
2
3
set minhow 0 0 6 //设置key=minhow,flags=0,exptime=0,bytes=6
minhow //value=minhow
STORED //设置成功输出

如果保存失败,会输出ERROR提示。

4.3 add 命令

add命令用于将 value (数据值) 存储在指定的 key (键) 中。
基本语法格式如下:

1
2
add key flags exptime bytes [noreply]
value

参数与set命令相同,这里不再介绍。实例如下:

1
2
3
add min-how 0 0 6 //添加key=min-how,flags=0,exptime=0,bytes=7
min-how //value=min-how
STORED //添加成功输出

如果 add 的 key 已经存在,则不会更新数据,之前的值将仍然保持相同,并且输出 NOT_STORED。

4.4 replace 命令

replace命令用于替换已存在的 key (键) 的 value (数据值)。
基本语法格式如下:

1
2
replace key flags exptime bytes [noreply]
value

实例如下:

1
2
3
replace minhow 0 0 14 //替换key=minhow,flags=0,exptime=0,bytes=14
www.minhow.com //value=www.minhow.com
STORED //替换成功输出

如果 key 不存在,则替换失败,输出 NOT_STORED。

4.5 get 命令

get命令获取存储在 key (键) 中的 value (数据值)。
基本语法格式如下:

1
get key

多个 key 使用空格隔开;实例如下:

1
2
3
4
get minhow //获取key=minhow的值
VALUE minhow 0 14
www.minhow.com
END

如果 key 不存在,则返回空。

4.6 delete 命令

delete命令用于删除已存在的 key (键)。
基本语法格式如下:

1
delete key [noreply]

实例如下:

1
2
delete minhow //删除key=minhow
DELETED //删除成功返回

如果 key 不存在,则返回 NOT_FOUND。

5. Memcached–工作原理

Memcached 处理的原子是每一个(key,value)对(以下简称kv对),key会通过一个 Hash 算法转化成 hash-key ,便于查找、对比以及做到尽可能的散列。同时,Memcached 用的是一个二级散列,通过一张大 Hash 表来维护。
Memcached 有两个核心组件组成:服务器端(server)和客户端(client),在一个 Memcached 的查询中,client先通过计算 key 的 hash值来确定 kv 对所处在的 server 位置。当 server 确定后,客户端就会发送一个查询请求给对应的 server,让它来查找确切的数据。因为这之间没有交互以及多播协议,所以Memcached交互带给网络的影响是最小化的。

6. Memcached–内存管理机制

先了解几个基本概念:
6.1 page:分配给Slab 的内存空间,大小固定为1MB。当 slab class 空间不足时,就会申请 page,并将 page 按 chunk 的大小进行切割。
6.2 slab class:在 Memcached 中,对元素的管理是以 slab 为单元进行管理的。每个 slab class 对应一个或多个空间大小相同的 chunk ;如下图:

hash_1

6.3 chunk:存放元素的最小单元。用户数据 item(key、value等)最终会保存在 chunk 中。Memcached 会根据元素大小将其放到合适的slab class 中。每一个 slab class 中的 chunk 空间大小是一样的,所以元素存放进来后,chunk 可能会有部分空间剩余;如下图:

hash_1

启动 Memcached 时,以-m指定大小的内存将会用于数据的存放。默认情况下,这些内存会被分隔成 1M 的 page。每个 page 在必要时分配给 slab class,然后根据 slab class 里 chunk 的大小,将 page 分隔成 chunk。
一旦一个 page 被赋给一个 slab class 后,它将不会再被移动。因为内存空间有限,如果在 slab class 3中使用了较多的page,那么在slab class 4中就只能使用较少的page。可以这么认为,Memcached 是一个有很多更小的相互独立的缓存系统,每一个更小的缓存系统实际上就是 slab class。每个 slab class 都有它自己的统计信息以及自己的 LRU。

7. Memcached–缓存策略

如果在相应的 slab class 里,既没有空闲的 chunk,也没有空闲的 page,Memcached 将会使用 LRU 算法(最近最少使用)查找应该被回收的元素。它将会查找 LRU 列表中尾部(最近最少使用)的一些元素,看它们是否已经失效,如果存在失效的元素,则将此元素占用的空间重用。如果找不到失效的元素,那么将踢出最尾部还没有失效的元素。

最后更新: 2018年01月06日 23:18

原始链接: http://blog.minhow.com/2017/01/05/database/memcached/

× 请我吃糖~
打赏二维码