Memcached 介绍及部署

Memcached 简介

MC介绍

memcached 是一个自由开源,高性能,分布式内存对象存储系统
基于内存的key-value存储,用来存储小块的任意数据(字符串、对象)
它是一个简洁的key-value存储系统f

分为服务端和客户端两部分
1.服务端:memcached
2.客户端:memcache

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

MC特性

  1. C/S模式架构:由C语言编写,总共2000多行代码。
    协议简单:使用的是基于文本行的协议,能通过telnet/nc直接操作Memcached服务存取数据。
  1. 支持epoll/kqueue异步I/O模型:使用libevent作为事件处理通知机制。
  2. Key/value键值对数据类型
  3. 纯内存缓存,效率高
  4. 支持分布式集群
  5. 多进程

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),这些内存块不会释放,可以重复利用,

小结:

  1. Mc的早期内存管理机制为malloc(动态内存分配)
  1. malloc(动态内存分配)产生内存碎片,导致操作系统性能急剧下降。
  2. lab内存分配机制可以解决内存碎片的问题
  3. Memcached服务的内存预先分割成特定长度的内存块,称为chunk,用于缓存数据的内存空间或内存块,相当于磁盘的block,只不过磁盘的每一个block都是相等的,而chunk只有在同一个Slab Class内才是相等的。
  4. Slab Class指特定大小(1MB)的包含多个chunk的集合或组,一个Memcached包含多个Slab Class,每个Slab Class包含多个相同大小的chunk。
  5. Slab机制也有缺点,例如,Chunk的空间会有浪费(通过调优因子以及大小接近的数据放入一个MC实例)

MC过期机制

  1. 不主动检测item对象是否过期,而是在get时才会检查item对象是否过期以及是否应该删除。
  1. 当删除item对象时,一般不释放内存空间,而是做删除标记,将指针放入slot回收插槽,下次分配的时候可以直接使用。
  2. 当内存空间满的时候,将会根据LRU算法把最近最少使用的item对象删除。
  3. 数据存入可以设定过期时间,但是数据过期后不会被立即删除,而是在get时检查item对象是否过期以及是否应该删除。
  4. 如果不希望系统使用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命令解释

  1. set 设置数据
  2. get 获取数据
  3. delete 删除数据
  4. replace 更新数据

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

             set                 key1         0            0              6                \r\n          benet        \r\n
<command name><key><flags><exptime><bytes><datablock><string><datablock>

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`
posted @ 2020-02-25 01:50  jasonminghao  阅读(753)  评论(0编辑  收藏  举报