-p <num> 监听的TCP端口 (缺省: 11211)
-d 以守护进程方式运行Memcached
-u <username> 运行Memcached的账户,非root用户
-m <num> 最大的内存使用, 单位是MB,缺省是 64 MB
-c <num> 软连接数量, 缺省是 1024
-v 输出警告和错误信息
-vv 打印客户端的请求和返回信息
-h 打印帮助信息
-i 打印memcached和libevent的版权信息
memcached.exe -m 32 -vv -p 11211
memcached已经打开,并监听11211端口,
因此,任何能满足端口通信的工具,
都可以连接memcahced
我们利用telnet来连接
telnet localhost 11211
连接后 ctrl+] ,然后回车, 打开回显功能
输入stats 回车, 即可查看memcached运行状态.
增: add
命令格式:
add key flag expiretime bytes
data
查: get
命令格式:
get key
改: replace
命令格式:
replace key flag expiretime bytes
data
删: delete key [time]
time参数是指使key失效并在time秒内不允许用此key
增改: set
命令格式:
set key flag expiretime bytes
data
add表示如果服务器没有保存该关键字的情况下,存储该数据;
replace表示在服务器已经拥有该关键字的情况下,替
换原有内容。
set表示存储该数据;--无则存,有则改
全删: flush_all [time]
time参数是指是所有缓存失效,并在time秒内限制使用删除的key
incr/decr 增加减少值的大小,32位无符号0~4294967295
应用场景------秒杀功能,
一个人下单,要牵涉数据库读取,写入订单,更改库存,及事务要求, 对于传统型数据库来说,
压力是巨大的.
可以利用 memcached 的 incr/decr 功能, 在内存存储 count 库存量, 秒杀 1000 台
每人抢单主要在内存操作,速度非常快,
抢到 count<=1000 的号人,得一个订单号,再去另一个页面慢慢支付
统计命令: stats
把 memcached 当前的运行信息统计出来
stats
stat pid 2296 进程号 stat uptime 4237 持续运行时间 stat time 1370054990 stat version 1.2.6 stat pointer_size 32 stat curr_items 4 当前存储的键个数 stat total_items 13 stat bytes 236 stat curr_connections 3 stat total_connections 4 stat connection_structures 4 stat cmd_get 20 stat cmd_set 16 stat get_hits 13 stat get_misses 7 // 这 2 个参数 可以算出命中率 stat evictions 0 stat bytes_read 764 stat bytes_written 618 stat limit_maxbytes 67108864 stat threads 1 end 缓存有一个重要的概念: 命中率. 命中率是指: (查询到数据的次数/查询总数)*100% 如上, 13/(13+7) = 60+% , 的命中率.
key是什么?
key是缓存名,
memcached的一个重要特点就是key-value缓存,
即键值对缓存.
每个缓存有一个独特的名字和存储空间.
key是操作数据的唯一标识
问:key能取多长
答:key可以250个字节以内,(不能有空格和控制字符)
注:在新版开发计划中提到key可能会扩充到65535个字节
flag有什么用?
flag是"标志"的意思,可以用此参数来标志内容的类型.
场景案例:
memcached存储的数据形式只能是字符串.
那么如果要存储 'hello' 和 array('hello','world'); 怎么办?
对于字符串,直接存5个字符即可, 对于array,则需要序列化.
问:取出数据时,又如何处理呢?
字符串,取回直接用, 数组,则需要反序列化成数组.
如何知道,取出的是一段"裸字符串",还是"数组序列化后的字符串"?
答:flag!
标志flag的范围
0-2^16-1
问:expire以什么为单位?
答:秒为单位
问:expire的秒数代表什么?
答:如果expire<=30*24*60*60,则代表自当前时间的偏移
即有效期在 time()+expire以内.
如果expire > 30 * 24 * 60 * 60 ,则直接代表时间戳.
即,在1970年+expire秒以内有效.
3.6 memcached 的过期数据惰性删除
1: 当某个值过期后,并没有从内存删除, 因此,stats 统计时, curr_item 有其信息
2: 当某个新值去占用他的位置时,当成空 chunk 来占用.
3: 当 get 值时,判断是否过期,如果过期,返回空,并且清空, curr_item 就减少了.
即--这个过期,只是让用户看不到这个数据而已,并没有在过期的瞬间立即从内存删除.
这个称为 lazy expiration, 惰性失效.
好处--- 节省了 cpu 时间和检测的成本
3.7: memcached 的 此处用的 lru 删除机制.
如果以 122byte 大小的 chunk 举例, 122 的 chunk 都满了, 又有新的值(长度为 120)要加入, 要
挤掉谁?
memcached 此处用的 lru 删除机制.
(操作系统的内存管理,常用 fifo,lru 删除)
lru: least recently used 最近最少使用
fifo: first in ,first out
原理: 当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用.
就把谁 t 出.
注: 即使某个 key 是设置的永久有效期,也一样会被踢出来!
即--永久数据被踢现象