memcache相关基础

来源:互联网 发布:南京银行怎么样 知乎 编辑:程序博客网 时间:2024/06/13 13:48

1.memcache协议

以1.2.2版本的协议为例:

  • 数据分为两种,命令行数据和自由数据。命令行数据以\r\n结尾,自由数据也以\r\n结尾,但由于自由数据中会允许包含\r,\n这种字符,所以在获取自由数据时,应以自由数据的length为标准。(这点和html协议有点类似)
  • key是一个字符串,长度不能超过250个,键值中不能使用制表符和其他空白字符(例如空格,换行等)。
  • 存储命令有set,add,replace。获取命令有get
  • 设置value的时限时,可以为unix时间戳(1970年1月1日开始的秒数),也可以是从当前时间开始的秒数。如果为第二种情况时,设置的秒数不能超过60*60*24*30(30天),否则会被认为是第一种情况
  • 存储命令格式:<command name> <key> <flags> <exptime> <bytes>\r\n。- <exptime> 是终止时间。如果为0,该项永不过期(虽然它可能被删除,以便为其他缓存项目腾出位置)。如果非0(Unix时间戳或当前时刻的秒偏移),到达终止时间后,客户端无法再获得这项内容。
  • 取回命令:get <key>*\r\n。- <key>* 表示一个或多个键值,由空格隔开的字串。服务器用以下形式发送每项内容: VALUE <key> <flags> <bytes>\r\n <data block>\r\n
  • 命令 “incr” 和 “decr”被用来修改数据,当一些内容需要 替换、增加 或减少时。这些数据必须是十进制的32位无符号整新。如果不是,则当作0来处理。修改的内容必须存在,当使用“incr”/“decr”命令修改不存在的内容时,不会被当作0处理,而是操作失败。(注意”decr”命令发生下溢:如果客户端尝试减少的结果小于0时,结果会是0。”incr” 命令不会发生溢出。)
  • flush_all 实际上没有立即释放项目所占用的内存,而是在随后陆续有新的项目被储存时执行。flush_all 效果具体如下:它导致所有更新时间早于flush_all所设定时间的项目,在被执行取回命令时命令被忽略。

1.4.0后协议改动:

  • 存储命令增加了append, prepend 和 cas; 获取命令增加了gets
  • 命令格式:<command name> <key> <flags> <exptime> <bytes> [noreply]\r\n 和 cas <key> <flags> <exptime> <bytes> <cas unique> [noreply]\r\n, <command name> is “set”, “add”, “replace”, “append” or “prepend”;
  • append是在已有的数据后追加数据,prepend是在已有的数据前加数据。append和prepend都不接受flag和exptime的参数。
  • “cas” is a check and set operation which means “store this data but only if no one else has updated since I last fetched it.”
  • <cas unique> is a unique 64-bit value of an existing entry. Clients should use the value returned from the “gets” command when issuing “cas” updates.
  • “noreply” optional parameter instructs the server to not send the reply.
  • incr和decr的命令要求数据为10进制64位整型。如果不是该类型,操作就会返回错误。

通过命令行操作

 1、数据存储(假设key为zhangyan,value为12345)
printf "set zhangyan 0 0 5\r\n12345\r\n" | nc 127.0.0.1 11211
 STORED

  2、数据取回(假设key为zhangyan)
printf "get zhangyan\r\n" | nc 127.0.0.1 11211
 VALUE zhangyan 0 5
 12345
 END


  3、数值增加1(假设key为zhangyan,并且value为正整数)
printf "incr zhangyan 1\r\n" | nc 127.0.0.1 11211
 12346

  4、数值减少3(假设key为zhangyan,并且value为正整数)
printf "decr zhangyan 3\r\n" | nc 127.0.0.1 11211
 12343

  5、数据删除(假设key为zhangyan)
printf "delete zhangyan\r\n" | nc 127.0.0.1 11211
 DELETED

  6、查看Memcached状态
printf "stats\r\n" | nc 127.0.0.1 11211
 STAT pid 3025
 STAT uptime 4120500
 STAT time 1228021767
 STAT version 1.2.6
 STAT pointer_size 32
 STAT rusage_user 433.463103
 STAT rusage_system 1224.515845
 STAT curr_items 1132460
 STAT total_items 8980260
 STAT bytes 1895325386
 STAT curr_connections 252
 STAT total_connections 547850
 STAT connection_structures 1189
 STAT cmd_get 13619685
 STAT cmd_set 8980260
 STAT get_hits 6851607
 STAT get_misses 6768078
 STAT evictions 0
 STAT bytes_read 160396238246
 STAT bytes_written 260080686529
 STAT limit_maxbytes 2147483648
 STAT threads 1
 END


  7、模拟top命令,查看Memcached状态:
watch "printf 'stats\r\n' | nc 127.0.0.1 11211"

  或者
watch "echo stats | nc 127.0.0.1 11211"

2. 命令行打印所有的键值?

首先列出所有keys

stats items

STAT items:7:number 1
STAT items:7:age 188
END

接下来基于列出的items id,本例中为7,第2个参数为列出的长度,0为全部列出
stats cachedump 7 0
ITEM Sess_sidsvpc1473t1np08qnkvhf6j2 [183 b; 1394527347 s]
END

上面的stats cachedump命令列出了我的session key,接下来就用get命令查找对应的session值
get Sess_sidsvpc1473t1np08qnkvhf6j2

VALUE

Sess_sidsvpc1473t1np08qnkvhf6j2 1440 1
83
Sess_|a:5:{s:6:”verify”;s:32:”e70981fd305170c41a5632b2a24bbcaa”;s:3:”uid”;s:1:”1
“;s:8:”username”;s:5:”admin”;s:9:”logintime”;s:19:”2014-03-11 16:24:25″;s:7:”log
inip”;s:9:”127.0.0.1″;} (94)


3.清楚所有键值?

flush_all
ok

flush并不会将items删除,只是将所有的items标记为expired,因此这时memcache依旧占用所有内存。
stats cachedump 1 0
ITEM c [3 b; 1402590157 s]
ITEM b [2 b; 1402590157 s]
ITEM a [3 b; 1402590157 s]

但get a ,get b get c ,均无返回。


 



0 0
原创粉丝点击