memcache 使用教程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 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安装和使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | 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就只能本机访问) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 | 语法: 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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?