memcache 使用教程

memcache本身没有像redis所具备的数据持久化功能,比如RDB和AOF都没有,但是可以通过做集群同步的方式,让各memcache服务器的数据进行同步,
从而实现数据的一致性,即保证各memcache的数据是一样的,即使有任何一台memcache发生故障,只要集群种有一台memcache可用就不会出现数据丢失,
当其他memcache重新加入到集群的时候可以自动从有数据的memcache当中自动获取数据并提供服务。

Memcache借助了操作系统的libevent工具做高效的读写。libevent是个程序库,它将Linux的epoll、BSD类操作系统的kqueue等事件处理功能封装成统一的接口。
即使对服务器的连接数增加,也能发挥高性能。memcached使用这个libevent库,因此能在Linux、BSD、Solaris等操作系统上发挥其高性能。
Memcache支持最大的内存存储对象为1M,超过1M的数据可以使用客户端压缩或拆分报包放到多个key中,比较大的数据在进行读取的时候需要消耗的时间比较长,
memcache最适合保存用户的session实现session共享,Memcached存储数据时, Memcached会去申请1MB的内存, 把该块内存称为一个slab, 也称为一个page。
memcached具有多种语言的客户端开发包,包括:Perl/PHP/JAVA/C/Python/Ruby/C#/


分类
Key-value Store           
	redis、memcached
Document Store            
	mongodb、CouchDB
Column Store列存数据库,Column-Oriented DB  
	HBase、Cassandra,大数据领域应用广泛
Graph DB                    
	Neo4j
Time Series 时序数据库     
	InfluxDB
	
	
	
	

Memcached只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统。


Memcached功能机制
内存分配机制:应用程序运行需要使用内存存储数据,但对于一个缓存系统来说,申请内存、释放内存将十分频繁,非常容易导致大量内存碎片,最后导致无连续可用内存可用。

Memcached采用了Slab Allocator机制来分配、管理内存。
Page: (slab与page同等)分配给Slab的内存空间,默认为1MB,分配后就得到一个Slab。Slab分配之后内存按照固定字节大小等分成chunk。
Chunk:用于缓存记录kv值的内存空间。Memcached会根据数据大小选择存到哪一个chunk中,假设chunk有128bytes、64bytes,数据只有100bytes存储在128bytes中,存在些浪费。
	Chunk最大就是Page的大小,即一个Page中就一个Chunk,也可以在一个Page中分多个Chunk
Slab Class:Slab按照大小分组,就组成不同的Slab Class,Slab之间的差异可以使用Growth Factor控制,默认1.25。-f参数控制。
	查看Slab Class    (memcached -u memcached -p 11211 -f 2 -vv)
	
	
懒过期Lazy Expiration
	memcached不会监视数据是否过期,而是在取数据时才看是否过期,过期的把数据有效期限标识为0,并不清除该数据。以后可以覆盖该位置存储其它数据。
LRU
	当内存不足时,memcached会使用LRU(Least Recently Used)机制来查找可用空间,分配给新纪录使用。
集群
	Memcached集群,称为基于客户端的分布式集群,即由客户端实现集群功能,即Memcached本身不支持集群,Memcached集群内部并不互相通信,
	一切都需要客户端连接到Memcached服务器后自行组织这些节点,并决定数据存储的节点。
	
	
# 与memcached通信的不同语言的连接器。 libmemcached提供了C库和命令行工具。
[root@localhost7A webapps]# yum list all   | grep memcached
memcached.x86_64                         1.4.15-10.el7_3.1          @Centos7    
libmemcached.i686                        1.0.16-5.el7               Centos7     
libmemcached.x86_64                      1.0.16-5.el7               Centos7     
libmemcached-devel.i686                  1.0.16-5.el7               Centos7     
libmemcached-devel.x86_64                1.0.16-5.el7               Centos7     
memcached-devel.i686                     1.4.15-10.el7_3.1          Centos7     
memcached-devel.x86_64                   1.4.15-10.el7_3.1          Centos7     
opensips-memcached.x86_64                1.10.5-4.el7               Centos7_epel
php-ZendFramework-Cache-Backend-Libmemcached.noarch
php-pecl-memcached.x86_64                2.2.0-1.el7                Centos7_epel
python-memcached.noarch                  1.48-4.el7                 Centos7     
uwsgi-router-memcached.x86_64            2.0.18-8.el7               Centos7_epel

 memcached安装和使用

root@centos7 ~]#yum –y install gcc  libevent-devel 
[root@centos7 ~]#wget http://memcached.org/files/memcached-1.5.22.tar.gz
[root@centos7 ~]#tar xvf  memcached-1.5.22.tar.gz 
[root@centos7 ~]#cd memcached-1.5.22/
[root@centos7 ~]#./configure  --prefix=/apps/memcached
[root@centos7 ~]#make && make install 
[root@centos7 ~]#tree /apps/memcached/
[root@centos7 ~]#echo 'PATH=/apps/memcached/bin:$PATH' > /etc/profile.d/memcached.sh
[root@centos7 ~]#. /etc/profile.d/memcached.sh
[root@centos7 ~]#useradd -r -s /sbin/nologin memcached
[root@centos7 ~]#memcached -u memcached  -m 2048 -c 65536 &
[root@centos7 ~]#ss -ntl



	
安装memcached	
# yum install memcached
# rpm -ql memcached

# cat /usr/lib/systemd/system/memcached.service
[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u USER -pPORT -m CACHESIZE -cMAXCONN $OPTIONS

# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"    #连接数
CACHESIZE="64"    #内存
OPTIONS=""

前台显示看看效果
# memcached -u memcached -p 11211  -vv

连接
# telnet  127.0.0.1 11211


修改memcached运行参数,可以使用下面的选项修改/etc/sysconfig/memcached文件
-u username memcached运行的用户身份,必须普通用户
-p 绑定的端口,默认11211
-m num 最大内存,单位MB,默认64MB
-c num 最大连接数,缺省1024
-d 守护进程方式运行
-f 增长因子Growth Factor,默认1.25
-v 详细信息,-vv能看到详细信息
-M 内存耗尽,不许LRU
-U 设置UDP监听端口,0表示禁用UDP
-P <file>     将PID写入文件<file>,这样可以使得后边进行快速进程终止, 需要与-d 一起使用
-l <ip_addr>  绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)

  

语法:
command <key> <flags> <expiration time> <bytes>
<value>


命令执行最简单的操作。这些命令和操作包括:
set  	:命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。(单词 STORED 进行响应)
add     :仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
replace :仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应。
get     :命令用于检索与之前添加的键值对相关的值。您将使用 get 执行大多数检索操作。
delete  :命令用于删除 memcached 中的任何现有值。您将使用一个键调用delete,如果该键存在于缓存中,则删除该值。如果不存在,则返回一条NOT_FOUND 消息。
stats: :统计数据
	stats items 显示各个 slab 中 item 的数目和存储时长(最后一次访问距离现在的秒数)。
	stats reset 清空统计数据
	stats slabs 显示各个slab的信息,包括chunk的大小、数目、使用情况等
	stats sizes 输出所有item的大小和个数(第一列是 item 的大小,第二列是 item 的个数)
	stats cachedump slabs_id limit_num
		slabs_id: 由stats items返回的结果(STAT items后面的数字)决定的
		limit_num:返回的记录数,0表示返回所有记录
		通过stats items、stats cachedump slab_id limit_num配合get命令可以遍历memcached的记录。
append  :将数据追加到当前缓存数据的之后,当缓存数据存在时才存储。
prepend :将数据追加到当前缓存数据的之前,当缓存数据存在时才存储。
flush_all:用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则 flush_all 能提供很大的用处。


参数:
参数			用法
key     		key 用于查找缓存值
flags     		可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息
expiration time         在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
bytes     		在缓存中存储的字节数
value     		存储的值(始终位于第二行)



范例:
1.add :仅当缓存中不存在键时,add 命令才会向缓存中添加一个键值对。如果缓存中已经存在键,则之前的值将仍然保持相同,并且您将获得响应 NOT_STORED。
add userid 1 0 5
12345
STORED

get userid
VALUE userid 1 5
12345
END

add userid 1 0 6
123456
NOT_STORED   #key值不能相同

add user 0 0 5  
abcd          #字节数少于申明的5个,无法操作。
e

add user 0 0 5
abcdef         #字节数多于申明的5个,提示信息。
CLIENT_ERROR bad data chunk
ERROR


2.get:命令用于检索与之前添加的键值对相关的值。您将使用 get 执行大多数检索操作。
add userid 1 0 5
12345
STORED

get userid
VALUE userid 1 5
12345
END


3.set  	:命令用于向缓存添加新的键值对。如果键已经存在,则之前的值将被替换。(单词 STORED 进行响应)
add userid 1 0 5
set userid 8 0 6
123456
STORED
get userid

VALUE userid 8 6
123456
END

4.replace :仅当键已经存在时,replace 命令才会替换缓存中的键。如果缓存中不存在键,那么您将从 memcached 服务器接受到一条 NOT_STORED 响应。

add userid  1 0 5
replace userid 6 0 5
12345
STORED

get userid
VALUE userid 6 5
12345
END

5.delete  :命令用于删除 memcached 中的任何现有值。您将使用一个键调用delete,如果该键存在于缓存中,则删除该值。如果不存在,则返回一条NOT_FOUND 消息。
set userId 0 0 5
98765
STORED

delete userId
DELETED

get userId
END



append  将数据追加到当前缓存数据的之后,当缓存数据存在时才存储。
prepend 将数据追加到当前缓存数据的之前,当缓存数据存在时才存储。

set name 0 0 4
bang
STORED
append name 0 0 4
chen
STORED

get name
VALUE name 0 8
bangchen
END

prepend name 0 0 4
yuan
STORED

get name
VALUE name 0 12
yuanbangchen
END


flush_all:用于清理缓存中的所有名称/值对。如果您需要将缓存重置到干净的状态,则 flush_all 能提供很大的用处。






实例的信息
STAT pid 22459                             进程ID
STAT uptime 1027046                        服务器运行秒数
STAT time 1273043062                       服务器当前unix时间戳
STAT version 1.4.4                         服务器版本
STAT pointer_size 64                       操作系统字大小(这台服务器是64位的)
STAT rusage_user 0.040000                  进程累计用户时间
STAT rusage_system 0.260000                进程累计系统时间
STAT curr_connections 10                   当前打开连接数
STAT total_connections 82                  曾打开的连接总数
STAT connection_structures 13              服务器分配的连接结构数
STAT cmd_get 54                            执行get命令总数
STAT cmd_set 34                            执行set命令总数
STAT cmd_flush 3                           指向flush_all命令总数
STAT get_hits 9                            get命中次数
STAT get_misses 45                         get未命中次数
STAT delete_misses 5                       delete未命中次数
STAT delete_hits 1                         delete命中次数
STAT incr_misses 0                         incr未命中次数
STAT incr_hits 0                           incr命中次数
STAT decr_misses 0                         decr未命中次数
STAT decr_hits 0                           decr命中次数
STAT cas_misses 0                          cas未命中次数
STAT cas_hits 0                            cas命中次数
STAT cas_badval 0                          使用擦拭次数
STAT auth_cmds 0                           认证命令处理的次数
STAT auth_errors 0                         认证失败数目
STAT bytes_read 15785                      读取字节总数
STAT bytes_written 15222                   写入字节总数
STAT limit_maxbytes 1048576                分配的内存数(字节)
STAT accepting_conns 1                     目前接受的链接数
STAT listen_disabled_num 0                 失效的监听数
STAT threads 4                             线程数
STAT conn_yields 0			   连接操作主动放弃数目
STAT bytes 0                               存储item字节数
STAT curr_items 0                          item个数
STAT total_items 34                        item总数
STAT evictions 0                           为获取空间删除item的总数

  

memcached集群部署架构
一、基于magent的部署架构
该部署方式依赖于magent实现高可用,应用端通过负载服务器连接到magent,然后再由magent代理用户应用请
求到memcached处理,底层的memcached为双主结构会自动同步数据,本部署方式存在magent单点问题因此需
要两个magent做高可用。

 

 

二、Repcached实现原理:
在 master上可以通过 -X指定 replication port,在 slave上通过 -x/-X找到 master并 connect上去,事实上,如果同时指定了 -x/-X,
repcached一定会尝试连接,但如果连接失败,它就会用 -X参数来自己 listen(成为master);如果 master坏掉, slave侦测到连接断了,它会自动 listen而成为 master;
而如果 slave坏掉,master也会侦测到连接断,它就会重新 listen等待新的 slave加入。从这方案的技术实现来看,其实它是一个单 master单 slave的方案,
但它的 master/slave都是可读写的,而且可以相互同步,所以从功能上看,也可以认为它是双机 master-master方案。
 

部署repcached:

 
1.两个都是主节点。视对方为从节点
2.复制双方中内存的K/V值 

一.部署repcached:
172.18.200.222   haproxy 
172.18.200.106	11211	主节点  memcached+repcached
172.18.200.105	11211	主节点  memcached+repcached



二.安装软件
yum install haproxy

vi /etc/haproxy/haproxy.cfg

listen  web_port
 bind 0.0.0.0:11211   #有VIP就监听VIP的IP。
 mode tcp 
 balance roundrobin 
 server web1  172.18.200.106:11211  check inter 3000 fall 2 rise 5 
 server web2  172.18.200.105:11211  check inter 3000 fall 2 rise 5 
 
三.安装服务器软件
yum install libevent libevent-devel memcached 
wget https://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz
[root@s6 src]# tar xvf memcached-1.2.8-repcached-2.2.1.tar.gz 
[root@s6 src]# cd memcached-1.2.8-repcached-2.2.1 
[root@s6 memcached-1.2.8-repcached-2.2.1]# ./configure --prefix=/usr/local/repcached -- enable-replication 
[root@s6 memcached-1.2.8-repcached-2.2.1]# make #报错如下
[root@s6 memcached-1.2.8-repcached-2.2.1]# vim memcached.c 
56 #ifndef IOV_MAX 
57 #if defined(__FreeBSD__) || defined(__APPLE__) 
58 # define IOV_MAX 1024 
59 #endif 
60 #endif 
改为如下内容: 
55 /* FreeBSD 4.x doesn't have IOV_MAX exposed. */ 
56 #ifndef IOV_MAX 
57 # define IOV_MAX 1024 
58 #endif
[root@s6memcached-1.2.8-repcached-2.2.1]# make && make install


/usr/local/repcached/bin/memcached -h
-x <ip_addr> hostname or IP address of peer repcached  对方IP
-X <num:num> TCP port number for replication. <listen:connect> (default: 11212) 对方端口,默认11212.
 
 四.启动
[root@s6 src]# /usr/local/repcached/bin/memcached -d -m 2048 -p 11211 -u root -c 2048 -x 172.18.200.106 -X 16000
[root@s5 src]# /usr/local/repcached/bin/memcached -d -m 2048 -p 11211 -u root -c 2048 -x 172.18.200.105 -X 16000


五.连接到memcache验证数据:
[root@s6 src]# telnet 172.18.200.222 11211 

set name 0 0 4 #key 的名为name,且永不超时 
jack STORED #符合长度后自动保存
get name 
VALUE name 0 4 
jack END 
 
 
[root@s6 src]# telnet 172.18.200.105 11211 #到其中一台memcached服务器验证是否有数据 
get name 
VALUE name 0 4 
jack
 
 

  

 
 
 
posted @ 2022-08-09 19:53  yuanbangchen  阅读(541)  评论(0编辑  收藏  举报