Memcached 官方网站:http://memcached.org/
官网对其的描述是:
What is Memcached? Free & open source, high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web applications by alleviating database load. Memcached is an in-memory key-value store for small chunks of arbitrary data (strings, objects) from results of database calls, API calls, or page rendering. Memcached is simple yet powerful. Its simple design promotes quick deployment, ease of development, and solves many problems facing large data caches. Its API is available for most popular languages.
Memcached 是一款免费、开源、高性能、分布式的内存对象缓存系统,它以键值对的形式存储数据,数据只能是字符串型,可以把 Memcached 假象成一个只有一张表的数据库:
key | varchar(255) |
value | text |
Memcached 的使用场景最好是分布式环境,如果只有一台服务器,则建议直接在关系型数据库中存储和读取数据。最好有单独的 Memcached 服务器。
当前最新版本(stable 稳定版)是 1.4.24,源码包下载地址:http://www.memcached.org/files/memcached-1.4.24.tar.gz
memcached 依赖于 libevent 库,需要先编译 libevent,下载地址:http://jaist.dl.sourceforge.net/project/levent/libevent/libevent-2.0/libevent-2.0.22-stable.tar.gz
安装过程:
libevent:
① 解压
[root@localhost src]# tar -zxvf libevent-2.0.22-stable.tar.gz
② 进入目录
[root@localhost src]# cd libevent-2.0.22-stable
③ 配置
可以通过
[root@localhost libevent-2.0.22-stable]# ./configure -h
来查看编译选项。
配置:
[root@localhost libevent-2.0.22-stable]# ./configure --prefix=/usr/local/libevent
④ 编译 && 安装
[root@localhost libevent-2.0.22-stable]# make && make install
memcached
① 解压:
[root@localhost src]# tar -zxvf memcached-1.4.24.tar.gz
② 进入目录
[root@localhost src]# cd memcached-1.4.24
③ 配置
[root@localhost memcached-1.4.24]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent
④ 编译 && 安装
[root@localhost memcached-1.4.24]# make && make install
⑤ 运行 memcached
[root@localhost local]# cd memcached/ [root@localhost memcached]# ll 总用量 12 drwxr-xr-x 2 root root 4096 8月 30 01:27 bin drwxr-xr-x 3 root root 4096 8月 30 01:27 include drwxr-xr-x 3 root root 4096 8月 30 01:27 share [root@localhost memcached]# ll bin/ 总用量 292 -rwxr-xr-x 1 root root 298213 8月 30 01:27 memcached [root@localhost memcached]# ./bin/memcached -p 11211 -m 64 -vvv can't run as root without the -u switch
出现 can't run as root without the -u switch 的原因是不能以 root 用户运行 memcached
查看当前用户:
[root@localhost memcached]# whoami
root
解决方案,以 nobody 身份启动 memcached:
[root@localhost memcached]# ./bin/memcached -p 11211 -m 64 -u nobody -vvv
可以在本地使用 telnet 连接虚拟机上的 memcached
telnet 192.168.254.100 11211
如果需要 memcached 在后台执行,可以使用
[root@localhost memcached]# ./bin/memcached -p 11211 -m 64 -u nobody -d
附:Windows(7 64位)下安装 memcached(1.4.24)及 memcached 的常用命令
下载地址:http://wendal.net/2015/04/27.html
下载解压,把主文件夹拷贝至任一目录,并且重命名为 "memcached"
①打开 "cmd",进入该目录:
②查看 memcached 版本和帮助
D:\memcached>memcached -h
③ 安装 memcached:
D:\memcached>memcached -d install
④ 开启 memcached:
D:\memcached>memcached.exe -p 11211 -l 127.0.0.1 -m 64 -d start
或者
如果需要把错误信息或者警告信息在服务器端输出,可以:
D:\memcached\memcached.exe -m 64 -p 11211 -vvv
也就是说此时在客户端进行的操作,服务器端会显示信息:
memcached 参数说明
-p:端口号,默认11211
-l:绑定地址 ( 默认:所有都允许,无论内外网或者本机更换 IP,有安全隐患,若设置为127.0.0.1就只能本机访问 )
-m:使用内存的大小,单位 mb
-c:最大同时连接数,默认是1024
-f:增长因子(每两个相邻 chunk 的大小比例),默认 1.25
⑤ 本机使用 telnet 进行客户端测试:
另外开启一个 cmd 窗口
使用 ctrl + ] 打开回显功能。
具体操作
Memcached 的操作分为系统类操作,包括 addServer, addServers, getStats, getVersion; 数据类操作:add, set, delete, flush, replace, increament, get; 高级方法:setMulti, deleteMulti, getMulti, getResultCode, getResultMessage
其中 addServers 的格式是 addServers(array)
array 的形式是
array(
array('127.0.0.1', 11211),
array('127.0.0.2', 11211)
)
添加一个键值存储:
add 语法:
add key flag expire length
flag:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息(如区分保存的值是字符串,或者序列化的对象等,取值时可以做相应的处理)
expire:在缓存中保存键值对的时间长度(以秒为单位,0 表示不主动清除)
length:长度,以字节为单位
add 已经存在的 key 是不能成功的:
获取(查询)某个键的值:get key
expire 可以是秒数(n 秒后失效),也可以是时间戳(什么时间失效),例如:
10 秒后失效
再例如当前时间戳是:1440774503
设置 100 秒后失效:
delete 删除键值
replace 替换值,参数和 add 一样:
replace 不能对不存在的键进行修改:
set 同时具有 add 和 replace 的功能,参数和 add 一样:
set 命令既可以修改已经存在的键的值,也可以增加不存在的键值。
incr key n :键 key 的值增加 n
decr key n :键 key 的值减少n
注意:key 的值是 32 位无符号的数
decr 应用场景:秒杀功能
下单时,有一系列的数据库操作,如写入订单、更改库存,还有事务要求,对于传统关系型数据库来说压力很大。
而秒杀的操作,是先秒抢一个订单号,余下的例如个人收货信息填写等操作可以不着急进行(可以凭借该订单号去另一个页面慢慢下订单、zhi'fu)。发订单号的操作就可以利用 memcached 的 decr 功能:
在内存中存储一个键值对 count 用来记录库存量,秒杀 n 件,则 count 的值是 n。秒杀时,对库存进行 memcached 的 decr 操作,然后进行判断返回的值,当返回的值大于 0,就说明抢单成功。当返回的值等于 0,活动结束。
也可以使用 incr 命令(秒杀 n 件,当 incr 返回的值等于 n 时,活动结束)。
由于抢单的主要操作都是在内存中进行,因此速度很快。
stats :统计
stats STAT pid 5368 #进程号 STAT uptime 3949 #持续运行时间 STAT time 1440823276 STAT version 1.4.24 STAT libevent 2.0.22-stable STAT pointer_size 32 STAT rusage_user 0.202000 STAT rusage_system 0.343000 STAT curr_connections 10 STAT total_connections 11 STAT connection_structures 11 STAT reserved_fds 20 STAT cmd_get 4 STAT cmd_set 3 STAT cmd_flush 0 STAT cmd_touch 0 STAT get_hits 3 STAT get_misses 1 # get_hits 和 get_misses 可以计算缓存命中率 STAT delete_misses 0 STAT delete_hits 0 STAT incr_misses 0 STAT incr_hits 1 STAT decr_misses 0 STAT decr_hits 2 STAT cas_misses 0 STAT cas_hits 0 STAT cas_badval 0 STAT touch_hits 0 STAT touch_misses 0 STAT auth_cmds 0 STAT auth_errors 0 STAT bytes_read 151 STAT bytes_written 172 STAT limit_maxbytes 67108864 STAT accepting_conns 1 STAT listen_disabled_num 0 STAT threads 4 STAT conn_yields 0 STAT hash_power_level 16 STAT hash_bytes 262144 STAT hash_is_expanding 0 STAT malloc_fails 0 STAT bytes 109 STAT curr_items 2 #当前存储的键的个数 STAT total_items 3 STAT expired_unfetched 0 STAT evicted_unfetched 0 STAT evictions 0 STAT reclaimed 0 STAT crawler_reclaimed 0 STAT crawler_items_checked 0 STAT lrutail_reflocked 0 END
flush_all:清除所有的键值。正在运行的系统上慎用。
此时 stats 查看统计时,curr_items 显示当前还有存储的键值,是因为过期所采用的是惰性失效机制。
memcached 内存分配机制
memcached 缓解内存的碎片化采用 slab allocator 机制来管理内存:预先把内存划分成若干个 slab 仓库,每个仓库切分成不同尺寸的小块,需要存内容时判断内容的大小,根据内容的大小选择合适的仓库。
注意:如果有 100 Byte 的数据要存储,但 122 Byte 大小的仓库中的 chunk 满了,memcached 并不会寻找更大的仓库如 144 Byte 的仓库来存储该数据,而是把 122 Byte 仓库的就数据踢掉。
LRU 删除机制
memcached 的过期数据删除机制:
当某个值过期后,并没有从内存中删除,因此 stats 统计时,curr_items 仍然有其信息;
当取该值的时候,判断是否过期,如果过期,返回空,并清空,此时 curr_items 就减少了;
有过之前没有 get 过,不会自动删除;
只有当某个新值占用它的位置时,当成空 chunk 来占用。
这个过期只是让用户看不到数据,并没有在过期的瞬间将其从内存中删除,称之为 lazy expriation(惰性失效机制),好处是 节省了 CPU 资源和检测的成本。
LRU:Least Recently Used 最近最少使用。不论这个最近最少使用的值是否是永久有效,当某个新值要占据它的位置时,它都会被踢掉。
memcached 的 key 的长度不超过 250 个字符 ,value 的长度不超过 1024 * 1024 个字符即 1M,推荐使用默认配置,也可以通过直接修改memcached.h源码来加大长度限制。在 32 位系统下内存最大设置为 2G,但一般不会在同一个 memcached 实例中进行存储(如果 memcached 服务挂了,有可能瞬间击穿 mysql 服务)。
参考:
http://www.2cto.com/os/201209/153833.html