标签:
Memcached 官方网站:http://memcached.org/
当前最新版本(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 + ] 打开回显功能。
具体操作
添加一个键值存储:
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 最近最少使用。不论这个最近最少使用的值是否是永久有效,当某个新值要占据它的位置时,它都会被踢掉。
参考:
http://www.2cto.com/os/201209/153833.html
http://blog.csdn.net/zzulp/article/details/7823511
Memcached 笔记与总结(1)Linux(CentOS 6.6) 和 Windows(7)下安装与配置 Memcached (1.4.24)与 Memcached 基础命令
标签:
原文地址:http://www.cnblogs.com/dee0912/p/4758925.html