Memcached缓存服务介绍及搭建

版权声明:本文为博主原创文章,转载请指明地址。 https://blog.csdn.net/Mr_rsq/article/details/82706360

1 Memcached是什么?

  • Memcached是一个开源的,支持高性能、高并发的分布式缓存系统,由C语言写成,共计2000多行代码。
  • Memcached服务分为服务端和客户端两部分,其中,服务端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的名字形如Memcache-2.25.tar.gz。
  • Memcached官方网址:http://memcached.org/

1.1 Memcached的作用

  • 传统场景,多数Web应用都将数据保存到关系型数据库中(例如:MySQL),Web服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,关系型数据库的负担就会出现加重、响应缓慢、导致网站打开延迟等问题,影响用户体验。
  • 这时就需要Memcached软件出马了。使用Memcached的主要目的是,通过在自身缓存中缓存关系型数据库的查询结果,减少数据库自身被访问的次数,以提高动态Web应用的速度、提高网站架构的并发能力和可扩展性。
  • Memcached服务的运行原理是通过在事先规划好的系统内存空间中临时缓存数据库的各类数据,以达到减少前端业务服务对数据库的直接高并发访问,从而达到提升大规模网站集群中动态服务的并发访问能力。

1.2 常见缓存服务软件对比

软件 类型 主要作用 缓存的数据
Memcached 纯内存型 常用语缓存网站后端的各类数据,例如数据库中的数据 主要缓存用户重复请求的动态内容,例如:blog的博文、bbs的帖子等内容及用户的Session会话信息
Redis、Memcachedb 持久化存储,即使用内存,也会使用磁盘存储 1、缓存后端数据库的查询数据2、作为关系数据库的重要补充 1、作为缓存:主要缓存用户重复请求的动态内容;例如:blog的博文、bbs的帖子等内容。
Squid、Nginx 内存或内存加磁盘缓存 主要用于缓存web前端的服务内容 主要用于静态数据缓存,例如:图片,附件(压缩包),js、css、html等,此部分功能大多数企业会选择专业的CDN公司,如:网宿、蓝讯

1.3 Memcached的特性

  1. 协议简单
  2. 支持epoll/kqueue异步I/O模型,使用libevent作为事件处理通知机制。
  3. key/value键值数据类型
  4. 全内存缓存,效率高(全部的数据都存放于Memcached服务事先分配好的内存中,无持久化存储的设计,和系统的物理内存一样,当重启系统或Memcached服务时,Memcached内存中的数据会丢失。若希望重启后,数据依然能保留,那么就可以采用redis这样的持久性内存缓存系统)
  5. 当内存中缓存的数据容量达到服务启动时设定的内存值时,就自动使用LRU算法删除过期的缓存数据。也可以在存放数据时对存储的数据设置过期时间,这样过期后数据就自动被清除,Memcached服务本身不会监控数据过期,而是在访问的时候查看key的时间戳判断是否过期。

2 Memcached安装配置

1、查看系统版本

cat /etc/redhat-release
uname -r
uname -m
[root@cache01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@cache01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@cache01 ~]# uname -m
x86_64

2、安装依赖libevent

[root@cache01 ~]# yum install libevent libevent-devel telnet nc
[root@cache01 ~]# rpm -qa libevent libevent-devel telnet nc
libevent-1.4.13-4.el6.x86_64
nc-1.84-24.el6.x86_64
libevent-devel-1.4.13-4.el6.x86_64
telnet-0.17-48.el6.x86_64

3、安装memcached

[root@cache01 ~]# yum install memcached -y
[root@cache01 ~]# rpm -qa memcached
memcached-1.4.4-5.el6.x86_64

4、查看指定参数

[root@cache01 ~]# memcached -h  

5、启动实例

[root@cache01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192
[root@cache01 ~]# lsof -i :11211
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 2317 root   26u  IPv4  14664      0t0  TCP *:memcache (LISTEN)
memcached 2317 root   27u  IPv6  14665      0t0  TCP *:memcache (LISTEN)
memcached 2317 root   28u  IPv4  14668      0t0  UDP *:memcache 
memcached 2317 root   29u  IPv6  14669      0t0  UDP *:memcache

# 多实例只需要启动不同端口即可
[root@cache01 ~]# memcached -m 16m -p 11212 -d -u root -c 8192
[root@cache01 ~]# ps -ef |grep memcached|grep -v grep
root       2317      1  0 15:08 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192
root       2335      1  0 15:11 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192

6、加入开机自启

cat >>/etc/rc.local<<EOF
/usr/bin/memcached -m 16m -p 11211 -d -u root -c 8192
/usr/bin/memcached -m 16m -p 11212 -d -u root -c 8192
EOF

**编译安装:**由于yum安装的memcached的版本略低,但是不影响使用,如果想安装更高版本的则需要编译安装,命令集合如下:

wget http://memcached.org/files/memcached-1.4.24.tar.gz
tar xf memcached-1.4.24.tar.gz
cd memcached-1.4.24
./configure
make && make install
cd ../

这里建议用yum或rpm安装,比较简单、易用

2.1 memcached命令参数

参数 作用
-l <ip_addr> 指定进程监听的IP地址,可以不设置此参数
-d 以守护进程(daemon)方式运行服务
-u 指定运行Memcached的用户,如果当前用户为root,需要使用此参数指定用户。
-p(小写) 指定Memcached服务监听TCP端口号。默认为11211
-P(大写) 设置保存Memcached的pid文件($$),保存PID到指定文件

内存相关设置

参数 作用
-m 指定Memcached服务可以缓存数据的最大内存。默认为64M
-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”命令可以显示所有可用选项。

2.2 管理MySQL和Memcached常见命令对比

MySQL数据库管理 Memcached管理
MySQL的insert语句 Memcached的set命令
MySQL的select与语句 Memcached的get命令
MySQL的delete语句 Memcached的delete命令
MySQL的update语句 Memcached的replace命令

操作memcached的相关命令基本语法

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

操作memcached的相关命令详细说明

command name 作用
set 无论如何进行写入数据,会覆盖老数据
add 只有对应数据不存在时才添加数据
replace 只有数据存在时进行替换数据
append 往后追加:append datablock
prepend 往前追加:prepend datablock
cas 按版本号更改
其它参数 作用
key 普通字符串,要求小于250个字符,不包含空格和控制字符
flags 客户端用来标识数据格式的数值,如json,xml,压缩等
exptime 存活时间s,0为永远,小于30天,606024*30为秒数,大于30天为unixtime
bytes byte字节数,不包含\r\n,根据长度截取存/取的字符串,可以是0,即存空串
datablock 文本行,以\r\n结尾,当然可以包含\r或\n
status STORED/NOT_STORED/EXISTS/NOT_FOUND ERROR/CLIENT_ERROR/SERVER_ERROR服务端会关闭连接以修复。

2.3 memcached服务存取数据

简单插入数据及查看数据

[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
oldgirl
STORED
get user01
VALUE user01 0 7
oldgirl
END
quit
Connection closed by foreign host.

在查询或删除数据的时候一定要指定键值来操作

[root@cache01 ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set k1 0 0 3
rsq
STORED
get k1
VALUE k1 0 3
rsq
END
delete rsq
NOT_FOUND
delete k1
DELETED
get k1
END
set k1 0 0 3
rsqrsq
CLIENT_ERROR bad data chunk
ERROR
quit
Connection closed by foreign host.

nc测试添加查找或删除数据

[root@cache01 ~]# printf "set key1 0 0 6\r\nrsqrsq\r\n"|nc 127.0.0.1 11211
STORED
[root@cache01 ~]# printf "get key1\r\n"|nc 127.0.0.1 11211
VALUE key1 0 6
rsqrsq
END
[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

替换测试

[root@cache01 ~]# printf "set key1 0 0 6\r\nrsqrsq\r\n"|nc 127.0.0.1 11211
STORED
[root@cache01 ~]# printf "get key1\r\n"|nc 127.0.0.1 11211
VALUE key1 0 6
rsqrsq
END
[root@cache01 ~]# printf "replace key1 0 0 6\r\nRSQRSQ\r\n"|nc 127.0.0.1 11211
STORED
[root@cache01 ~]# printf "get key1\r\n"|nc 127.0.0.1 11211
VALUE key1 0 6
RSQRSQ
END

2.4 停止memcached服务

[root@cache01 ~]# ps -ef|grep "memcached"|grep -v "grep"
root       2317      1  0 06:56 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192
root       2335      1  0 06:58 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192
[root@cache01 ~]# ps -ef|grep "memcached"|grep -v "grep"
root       2317      1  0 06:56 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192
root       2335      1  0 06:58 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192
[root@cache01 ~]# killall memcached
[root@cache01 ~]# ps -ef|grep "memcached"|grep -v "grep"
[root@cache01 ~]#

最好启动memcached服务的参数中创建一个pid文件,这样方便停止服务

[root@cache01 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid
[root@cache01 ~]# lsof -i :11211
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
memcached 2685 root   26u  IPv4  17610      0t0  TCP *:memcache (LISTEN)
memcached 2685 root   27u  IPv6  17611      0t0  TCP *:memcache (LISTEN)
memcached 2685 root   28u  IPv4  17614      0t0  UDP *:memcache 
memcached 2685 root   29u  IPv6  17615      0t0  UDP *:memcache 
[root@cache01 ~]# kill `cat /var/run/11211.pid`
[root@cache01 ~]# lsof -i :11211
[root@cache01 ~]#

猜你喜欢

转载自blog.csdn.net/Mr_rsq/article/details/82706360