Memcached 介绍及部署

Memcached 介绍及部署

Memcached 简介

目录Memcached 简介MC介绍MC特性MC企业应用场景MC数据存储机制MC内存管理机制MC过期机制Memcached 部署MC安装MC服务基本管理MC基本操作

MC介绍

memcached 是一个自由开源,高性能,分布式内存对象存储系统

基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)

它是一个简洁的key-value存储系统f

分为服务端和客户端两部分

1.服务端:memcached

2.客户端:memcache

使用目的:通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

MC特性

C/S模式架构:由C语言编写,总共2000多行代码。

协议简单:使用的是基于文本行的协议,能通过telnet/nc直接操作Memcached服务存取数据。

支持epoll/kqueue异步I/O模型:使用libevent作为事件处理通知机制。

Key/value键值对数据类型

纯内存缓存,效率高

支持分布式集群

多进程

MC企业应用场景

1.完整缓存(容易)

例如:京东的商品分类,就可以事先放在Memcached里,然后在对外提供数据访问,这个被称之为“数据预热”

2.热点缓存(难)

热点缓存一般是用于由用户更新的商品,例如淘宝的卖家,当卖家新增商品后,淘宝网的程序就会把商品写入数据库,然后读取写入的数据,把这部分数据,放入 Memcached中,下一次访问这个商品的请求直接从Memcached中取走了。

3.作为集群节点的session会话共享存储

MC数据存储机制

需要被缓存的数据以key/value键值对的形式保存在服务器端预分配的内存区中,每个被缓存的数据都有唯一的标识key,操作Memcached中的数据就是通过这个唯一标识的key进行的。

MC内存管理机制

Memcached采用了如下机制:

1.采用slab内存分配机制

2.采用LRU对象清除机制

3.采用hash机制快速检索item

memcached是利用Slab Allocation机制来分配和管理内存的,提前将大内存分配大小为1MB的若干个slab,然后针对每个slab再进行小对象填充,这个小对象称为chunk,避免大量重复的初始化和清理,减轻了内存管理器的负担。

Slab Allocation内存分配的原理是按照预先规定的大小,将分配给Memcached服务的内存预先分割成特定长度的内存块(chunk),再把尺寸相同的内存块(chunk)分成组(chunks slab class),这些内存块不会释放,可以重复利用,

小结:

Mc的早期内存管理机制为malloc(动态内存分配)

malloc(动态内存分配)产生内存碎片,导致操作系统性能急剧下降。

lab内存分配机制可以解决内存碎片的问题

Memcached服务的内存预先分割成特定长度的内存块,称为chunk,用于缓存数据的内存空间或内存块,相当于磁盘的block,只不过磁盘的每一个block都是相等的,而chunk只有在同一个Slab Class内才是相等的。

Slab Class指特定大小(1MB)的包含多个chunk的集合或组,一个Memcached包含多个Slab Class,每个Slab Class包含多个相同大小的chunk。

Slab机制也有缺点,例如,Chunk的空间会有浪费(通过调优因子以及大小接近的数据放入一个MC实例)

MC过期机制

不主动检测item对象是否过期,而是在get时才会检查item对象是否过期以及是否应该删除。

当删除item对象时,一般不释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候可以直接使用。

当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除。

数据存入可以设定过期时间,但是数据过期后不会被立即删除,而是在get时检查item对象是否过期以及是否应该删除。

如果不希望系统使用LRU算法清除数据,可以用使用-M参数。

Memcached 部署

MC安装

1.系统环境

[root@cache01 ~]# cat /etc/redhat-release

CentOS Linux release 7.4.1708 (Core)

[root@cache01 ~]# uname -r

3.10.0-693.el7.x86_64

2.安装MC

Memcached的安装比较简单,支持Memcached的平台常见的有Linux,FreeBSD,Solaris,Windows。

//1.安装libevent及连接Memcached工具nc

cd /server/tools/

yum -y install libevent libevent-devel

//2.编译的方式安装

wget http://www.memcached.org/files/memcached-1.5.12.tar.gz

tar xf memcached-1.5.12.tar.gz

cd memcached-1.5.12/

./configure

make

make install

cd ../

提示:yum安装的memcached版本略低,但是不影响使用,如果想要安装更高版本的则需要编译安装

yum install memcached -y

MC服务基本管理

1.启动Memcached

//1.命令行方式启动Memcached

[root@cache01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 #启动第一个mc实例

//2.检查启动结果

[root@cache01 ~]# ps -ef | grep memcached | grep -v grep

root 2071 1 0 13:52 ? 00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192

2.启动多实例memcached

//启动多一个11212端口的MC实例

[root@cache01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192

[root@cache01 ~]# ps -ef | grep memcached | grep -v grep

root 2071 1 0 13:52 ? 00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192

root 2086 1 0 13:53 ? 00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192

3.加入开机自启动

//把上述两个实例的启动命令放入/etc/rc.local,以便下次开机可以自启动。

[root@cache01 ~]# tail -2 /etc/rc.local

memcached -m 16m -p 11211 -d -u root -c 8192

memcached -m 16m -p 11212 -d -u root -c 8192

MC启动命令参数

#进程与连接设置:

-d 以守护进程(daemon)方式运行服务

-u 指定运行Memcached的用户,如果当前用户为root,需要使用此参数指定用户

-l 指定Memcached进程监听的服务器IP地址,可以不设置此参数

-p(小写)指定Memcached服务监听TCP端口号。默认为11211

-P(大写)设置保存Memcached的pid文件($$),保存PID到指定文件

#内存相关设置:

-m 指定Memcached服务可以缓存数据的最大内存,默认为64MB

-M Memcached服务内存不够时禁止LRU,如果内存满了会报错

-n 为key+value——flags分配的最小内存空间,默认为48字节

-f chunk size增长因子,默认为1.25

-L 启用大内存页,可以降低内存浪费,改进性能

#并发连接设置:

-c 最大的并发连接数,默认是1024

-t 线程数,默认4.由于Memcached采用的是NIO,所以太多线程作用不大

-R 每个event最大请求数,默认是20

-C 禁用CAS(可以禁止版本计数,减少开销)

#测试参数:

-v 打印较少的errors/warnings

-vv 打印非常多调试信息和错误输出到控制台

-vvv 打印极多的调试信息和错误输出,也打印内部状态转变

#其他选项可通过在命令行输入“memcached -h”命令来显示。

MC基本操作

向Memcached中添加数据时,注意添加的数据一般为键值对的形式,例如:key1-->values1,key2-->values2

1.安装工具

mc数据插入可以使用交互式的方式,工具有nc和telnet

yum instasll nc telnet -y

2.通过printf配合nc向Memcached中写入数据

//向memcached写入数据

[root@cache01 ~]# printf "set key1 0 0 6\r\njason\r\n" | nc 127.0.0.1 11211

STORED #出现STORED表示成功添加key1及对应的数据

[root@cache01 ~]# printf "replace key1 0 0 7\r\nxmh\r\n" | nc 127.0.0.1 11211

STORED #replace 更新数据

//如果set命令的字节是6,那么后面就要6个字符(字节)。否则插入数据就会不成功

[root@cache01 ~]# printf "set key1 0 0 4\r\nbenet\r\n" | nc 127.0.0.1 11211

CLIENT_ERROR bad data chunk

ERROR

//通过printf配置nc从Memcached中读取数据

[root@cache01 ~]# printf "get key1\r\n" | nc 127.0.0.1 11211

VALUE key1 0 5

benet #这就是读取到的key1对应额值

//通过printf配合nc从Memcached中删除数据

[root@cache01 ~]# printf "delete key1\r\n" | nc 127.0.0.1 11211

DELETED

[root@cache01 ~]# printf "get key1\r\n" | nc 127.0.0.1 11211

END

3.通过telnet命令写入数据时

[root@cache01 ~]# telnet 127.0.0.1 11211

Trying 127.0.0.1...

Connected to 127.0.0.1.

Escape character is '^]'.

set user01 0 0 7 #写入数据,创建key,长度等

jason12 #数据长度要和value一致

STORED

get user01 #浏览数据

VALUE user01 0 7

jason12

END

delete user01 #删除数据,删除的是key

DELETED

get user01 #再次浏览数据,数据被删除

END

quit #quit退出

Connection closed by foreign host.

Memcached命令解释

set 设置数据

get 获取数据

delete 删除数据

replace 更新数据

操作MC相关命令的语法

以下为操作Memcached的相关命令基本语法:

set key1 0 0 6 \r\n benet \r\n

command # 命令参数(set、get、delete、replace)

key # key 用于查找缓存值,要求小于250字符,不包含空格和控制字段

flags # 用户端用来表示数据格式数值,如json、xml、压缩等

exptime # 在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)

bytes # 在缓存中存储的字节数

datablock # 文本行,以\r\n结尾

string # 键值对应的缓存内容

4.关闭MC

单实例关闭Memcached:

killall memcached或pkill memcached

当启动了多个实例Memcached,使用killall或pkill方式就会同时关闭这些实例!因此最好在启动时增加-P参数指定固定的pid文件,这样便于管理不同的实例。

//启动多实例MC指定PID文件

[root@cache01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid

[root@cache01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid

[root@cache01 ~]# ps -ef | grep memcached | grep -v grep

root 1486 1 0 11:14 ? 00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid

root 1493 1 0 11:14 ? 00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid

//此时,即可通过kill命令指定pid文件,来关闭Memcached

[root@cache01 ~]# kill `cat /var/run/11211.pid`

相关推荐