1、MemCache 简介
memcached 是一款开源的、高性能的纯内存缓存服务软件,mem 是内存的意思 ,cache 是缓存的意思 , d 是 daemon 的意思
memcache 是项目的名字,诞生于 2003 年,memcached 服务分为 客户端和服务端两部分,C/S 架构 ;
缓存数据库包含 ; memcache redis ,它们的 数据是存储在内存中,而内存的速度远远快于磁盘加快网页响应速度 ;
NOSQL 数据库;not only SQL ( 非关系型数据库 ) ;
memcache缓存数据库的并发 ; —>> 10w
memcache的缺点就是内存的缺点 —->> 断点数据丢失
企业中常用的memcache 架构 : MySQL + memcache (互补一下 )
这里说一下 Redis 优点 ;
Redis 工作区域在内存,但是会定时的将内存的数据保存到磁盘中 。
2、MemCache 原理以及优点
再启动 memcache 的时候 ,需要指定内存大小,根据指定的内存大小会被分配一个内存空间,当我们读取数据库的各类业务数据后,数据会同时放入到memcache 缓存中,当用户下一次请求同样的数据时,程序直接去memcache 缓存中取数据,直接返回给用户 。
优点 :
① 对于用户而言,用户访问网页更快了,体验好
② 对于网站来说,数据库的压力降低了,只有当内存没有数据的时候才会去请求数据库,第一次写入数据是会请求数据库。
因为 memcached 是直接从内存读取数据的很快 ,而MySQL是从磁盘取数据的,上面也说了内存的响应速度比磁盘快很多 。
还有就是一般公司会有 “预热” 就是先把MySQL 中的数据放到 memcache 中 。
③ 提升了网站的并发访问,减少服务器数量 ;
3、memcache 部署
3.1 编译安装libevent
Libevent是一个异步事件处理软件函式库,以BSD许可证释出。Memcached依赖Libevent,因此必须先编译安装Libevent。
3.1.1 下载安装包
先到官网http://libevent.org/ 下载最新版本压缩包并解压
3.1.2 编译安装
进入解压目录,执行:
1 | ./configure –prefix=/usr |
3.1.3 检测libevent 安装是否成功
输入:ls -al /usr/lib | grep libevent,若看到类似一下的信息,说明已安装成功:
1 | $ ls -al /usr/lib |grep libevent |
3.2 编译安装Memcached
3.2.1 下载安装包
到官网http://memcached.org/downloads 下载最新版本压缩包解压
3.2.2 编译安装
进入解压目录,执行:
1 | ./configure –with-libevent=/usr |
3.2.3 测试Memcached是否安装成功
启动服务
1 | memcached -d -m 128 -p 11111 -u zenghao |
测试连接
1 | telnet 127.0.0.1 11111 |
输入:stats,显示部分信息罗列如下:
STAT pid 11812
STAT uptime 148
STAT time 1457491358
STAT version 1.4.25
STAT libevent 2.0.21-stable
STAT pointer_size 64 当前操作系统的指针大小(64位系统一般是64bit)
STAT total_connections 11 从服务器启动以后曾经打开过的连接数
STAT connection_structures 11 服务器分配的连接构造数
STAT cmd_get 0 get命令(获取)总请求次数
STAT cmd_set 0 set命令(保存)总请求次数
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0 总命中次数
STAT get_misses 0 总未命中次数
STAT bytes_read 16 总读取字节数(请求字节数)
STAT bytes_written 16
STAT time_in_listen_disabled_us 0
STAT threads 4 当前线程数
STAT bytes 0
STAT curr_items 0 服务器当前存储的items数量
STAT total_items 0
STAT evictions 0 为获取空闲内存而删除的items数(分配给memcache的空间用满后需要
END
3.3 编译安装magent
3.3.1 下载安装包
到官网https://code.google.com/archive/p/memagent/downloads 下载最新版本压缩包解压
3.3.2 编译安装
进入解压目录,执行:
1 | /sbin/ldconfig |
3.3.3 测试是否安装成功
在任意目录下执行命令:magent, 若看到以下,说明已安装成功:
please provide -s “ip:port” argument
memcached agent v0.6 Build-Date: Mar 9 2016 10:09:09
Usage:
-h this message
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don’t go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, set max keep alive connections for one memcached server, default is 20
-v verbose
4、memcache 基本使用与集群
4.1 memcache 基本使用
4.1.1 memcache 服务端启动
先进入memcached的安装目录,执行:
1 | ./memcached -d -m 10 -u root -l 127.0.0.1 -p 12000 -c 256 -P /tmp/memcached.pid |
-d 选项是启动一个守护进程,
-m 是分配给Memcache使用的内存数量,单位是MB,我这里是10MB,默认64M
-u 是运行Memcache的用户
-l 是监听的服务器IP地址,我这里指定了服务器的IP地址127.0.0.1,默认是本机
-p 是设置Memcache监听的端口,我这里设置了12000,最好是1024以上的端口,
-c 是最大运行的并发连接数,默认1024,这里设置了256,按照服务器的负载量来设定,
-P 是设置保存Memcache的pid文件,我这里是保存在/tmp/memcached.pid,
-h 查看帮助
4.1.2 结束一个Memcache进程
1 | kill cat /tmp/memcached.pid |
注意,上面命令中的符号是 `,不是单引号’
4.1.3 启动Magent代理
1 | magent -u root -n 51200 -l 127.0.0.1 -p 12000 -s 127.0.0.1:11211 -s 127.0.0.1:11212 -b 127.0.0.1:11213 |
命令参数:
-h help
-u uid
-g gid
-p port, default is 11211. (0 to disable tcp support)
-s ip:port, set memcached server ip and port
-b ip:port, set backup memcached server ip and port
-l ip, local bind ip address, default is 0.0.0.0
-n number, set max connections, default is 4096
-D don’t go to background
-k use ketama key allocation algorithm
-f file, unix socket path to listen on. default is off
-i number, set max keep alive connections for one memcached server, default is 20
-v verbose
4.1.4 利用magent搭建memcached集群
4.2 memcache 集群
4.2.1 magent的工作原理:一致性散列
如果固定服务器台数,可以简单地用键的散列值对服务器台数取模,得余数来决定服务器与数据的对应处理关系,但如果服务器台数发生变化,键值不变,则变化前后数据与服务器的对应关系就会发生变化,比如,本来数据A对应键值4443,对应4台服务器,4443 % 4 = 3,则交给编号③服务器处理,但现在新增一台服务器,则4443 % 5 != 3。而处理数据的服务器发生变化,因为缓存的原因,数据可能就无法正常读取,使用一致性散列的分散算法可以解决这个问题。
它的实现原理是先对各个服务器对应的散列值进行计算,把它们分配到一个圆周上。同时对各个数据对应的键的散列值进行计算,从键的散列值出发沿圆周向右,由距离改散列值最近的服务器来处理这条数据(数据的保存、读取都由这台服务器来执行。如下图所示
而在增加了服务器后,如下图中的服务器5,则服务器1,2,3处理的数据范围不变,仅将服务器4的一部分数据交给服务器5处理,这样可以大大降低缓存错误带来的影响。
由于memcache的数据都保存在内存中,当memcache由于故障等原因重启时,所有的数据都会丢失,因此memcache最好存储原始数据的备份或通过原始数据计算得到的结果
4.2.2 基本操作
保存数据
set <key> <flag> <expires> <byte> [换行] <value>
参数:
flag->是否压缩数据,0:不压缩,1:压缩
expires->指定数据以秒为单位的保存时间(0表示有效期无限)
byte->指定作为值保存的数据的字节数。当用户希望存储空数据时,可以为0
实例:
set test 0 0 3
qqq
STORED
4.2.3 读取数据
get <key>
4.2.4 删除KeyValue:
1 | delete <key> <time> <br> |
- 需要被删除数据的key
- 客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)
4.2.5 结果响应:reply
当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:
a) “STORED\r\n”:表示存储成功
b) “NOT_STORED\r\n” : 表示存储失败,但是该失败不是由于错误。
4.2.6 其它命令
- incr 数值加法
- append/prepend [换行] 在数据尾/头添加内容
- tats reset 清空统计数据
stats malloc 显示内存分配数据
stats detail [on|off|dump] 设置或者显示详细操作记录
参数为on,打开详细操作记录
参数为off,关闭详细操作记录
参数为dump,显示详细操作记录(每一个键值get、set、hit、del的次数)flush_all 清空所有键值
注:flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。quit\r\n 退出
5、操作示例
这里以二机集群测试为例:
5.1 启动Memcached及代理
启动两个memcached进程,端口分别为11211和11212:
1 | memcached -d -u zenghao -p 11211 |
5.2 再启动两个magent进程
端口分别为10000和11000:
1 | magent -u zenghao -n 5120 -l 127.0.0.1 -p 10000 -s 127.0.0.1:11211 -b 127.0.0.1:11212 |
-s 为要写入的memcached, -b 为备份用的memcached。
说明:测试环境用magent和memached的不同端口来实现,在生产环境中可以将magent和memached作为一组放到两台服务器上。也就是说通过magent能够写入两个memcached。
5.3 数据读写测试
1 | telnet 127.0.0.1 10000 |
1 | telnet 127.0.0.1 11211 |
1 | telnet 127.0.0.1 11212 |
从以上测试,我们可以看到,两个memcache都在端口(模拟两台服务器)实现了缓存交互。
原文链接:https://blog.csdn.net/qwe6112071/article/details/50834660