Memcached

-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 是设置的永久有效期,也一样会被踢出来!
即--永久数据被踢现象

原文地址:https://www.cnblogs.com/microtiger/p/8042891.html