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`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值