Memcached 存储,查找命令

set,add replace写入memcache

<command name> <key> <flags> <exptime> <bytes>\r\n <data block>\r\n

a) <command name> 可以是"set", "add", "replace"。 
  "set"表示按照相应的<key>存储该数据,没有的时候增加,有的覆盖。 
  "add"表示按照相应的<key>添加该数据,但是如果该<key>已经存在则会操作失败。 
  "replace"表示按照相应的<key>替换数据,但是如果该<key>不存在则操作失败

b) <key> 客户端需要保存数据的key。

c) <flags>是一个16位的无符号的整数(以十进制的方式表示)。 
  该标志将和需要存储的数据一起存储,并在客户端get数据时返回。 
  客户可以将此标志用做特殊用途,此标志对服务器来说是不透明的。

d) <exptime>过期的时间。 
  若为0表示存储的数据永远不过时(但可被服务器算法:LRU 等替换)。 
  如果非0(unix时间或者距离此时的秒数),当过期后,服务器可以保证用户得不到该数据(以服务器时间为标准)。

e) <bytes>需要存储的字节数(不包含最后的”\r\n”),当用户希望存储空数据时,<bytes>可以为0

f) 最后客户端需要加上”\r\n”作为”命令头”的结束标志。 
  <data block>\r\n 
紧接着”命令头”结束之后就要发送数据块(即希望存储的数据内容),最后加上”\r\n”作为此次通讯的结束。

结果响应:当以上数据发送结束之后,服务器将返回一个应答。可能有如下的情况:

a) "STORED\r\n":表示存储成功

b) "NOT_STORED\r\n": 表示存储失败,但是该失败不是由于错误。

通常这是由于”add”或者”replace”命令本身的要求所引起的,或者该项在删除队列之中。

set test 0 900 11
hello world
STORED
get test
VALUE test 0 11
hello world
END

get获取/检查KeyValue

get <key>*\r\n

a) <key>*表示一个或者多个key(以空格分开)

b) “\r\n” 命令头的结束

结果响应:reply服务器端将返回0个或者多个的数据项。每个数据项都是由一个文本行和一个数据块组成。当所有的数据项都接收完毕将收到”END\r\n”

每一项的数据结构:

VALUE <key> <flags> <bytes>\r\n
<data block>\r\n

a) <key>希望得到存储数据的key

b) <falgs>发送set命令时设置的标志项

c) <bytes>发送数据块的长度(不包含”\r\n”)

d) “\r\n”文本行的结束标志

e) <data block>希望接收的数据项。

f) “\r\n”接收一个数据项的结束标志。

如果有些key出现在get命令行中但是没有返回相应的数据,这意味着服务器中不存在这些项,这些项过时了,或者被删除了。

#存在该键值
get test
VALUE test 0 11
hello world
END
#不存在该键值
get test111
END

delete删除数据

Memcached的delete命令用于删除memcached服务器现有的键。

delete <key> <time>\r\n

a) <key>需要被删除数据的key

b) <time>客户端希望服务器将该数据删除的时间(unix时间或者从现在开始的秒数)

c) “\r\n” 命令头的结束

get test
VALUE test 0 5
hello
END
delete test
DELETED
get test
END

Memcached cas命令

Memcached 的cas命令用于设置数据,如果自上一次获取没有人更新。如果该键不在memcached中,那么它返回NOT_FOUND,memcached的cas命令的基本语法如下所示:

cas key flags exptime bytes unique_cas_key \r\n
value
  • key 是通过被存储在Memcached的数据并从memcached获取键(key)的名称。

  • flags 是32位无符号整数,该项目被检索时用的数据(由用户提供),并沿数据返回服务器存储。

  • exptime 以秒过期时间,0表示没有延迟,如果exptime大于30天,Memcached将使用它作为UNIX时间戳过期。

  • bytes 是在数据块中,需要被存储的字节数。基本上,这是一个需要存储在memcached的数据的长度。

  • unique_cas_key 从gets命令的获得唯一键。

  • noreply (optional) 参数告知服务器不发送回复

  • value 是一个需要存储的数据。数据需要将通过在新的一行后,执行命令上述选项。

返回:

  • STORED 表示成功。

  • ERROR 以表明有问题,同时保存数据或错误的语法。

  • EXISTS 以表明自上一次获取起已有人修改了CAS数据。

  • NOT_FOUND 以表示该键不存在于memcached服务器。

实例 
要在 Memcached 上使用 CAS 命令,你需要从 Memcached 服务器通过gets命令获取令牌(token)。

gets命令的功能类似于基本的get命令。两个命令之间的差异在于,gets返回的信息稍微多一些:64 位的整型值非常像名称/值对的 "版本" 标识符。 
步骤:

如果没有设置唯一令牌,则 CAS 命令执行错误。
如果键 key 不存在,执行失败。
添加键值对。
通过 gets 命令获取唯一令牌。
使用 cas 命令更新数据
使用 get 命令查看数据是否更新
cas tp 0 900 9
ERROR             <− 缺少 token
cas tp 0 900 9 2
memcached
NOT_FOUND         <− 键 tp 不存在
set tp 0 900 9
memcached
STORED
gets tp
VALUE tp 0 9 1
memcached
END
cas tp 0 900 5 1
redis
STORED
get tp
VALUE tp 0 5
redis
END

Memcached gets命令

Memcached的gets命令用于获取cas令牌值。如果该键在memcached中不存在,那么它没有返回值。

memcached的基本gets命令的语法如下:

gets key
#当test不存在时
gets test
END
//当键test存在时,通过gets查看当前版本号为6
set test 0 900 5
hello
STORED
gets test
VALUE test 0 5 6
hello
END
//通过版本号cas,修改成功后,然后查看,此时版本号已经为7了
cas test 0 900 5 6
simon
STORED
gets test
VALUE test 0 5 7
simon
END

Memcached prepend 命令

Memcached prepend 命令用于向已存在 key(键) 的 value(数据值) 前面追加数据 。

prepend 命令的基本语法格式如下:

prepend key flags exptime bytes [noreply]
value

参数说明:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例如下:

首先我们在 Memcached 中存储一个键 test,其值为 memcached。
然后,我们使用 get 命令检索该值。
然后,我们使用 prepend 命令在键为 test 的值后面追加 "redis"。
最后,我们再使用 get 命令检索该值。
set test 0 900 9
memcached
STORED
get test
VALUE test 0 9
memcached
END
prepend test 0 900 5
redis
STORED
get test
VALUE test 0 14
redismemcached
END

Memcached append 命令

Memcached append命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 。

append 命令的基本语法格式如下:

append key flags exptime bytes [noreply]
value

参数说明:

  • key:键值 key-value 结构中的 key,用于查找缓存值。
  • flags:可以包括键值对的整型参数,客户机使用它存储关于键值对的额外信息 。
  • exptime:在缓存中保存键值对的时间长度(以秒为单位,0 表示永远)
  • bytes:在缓存中存储的字节数
  • noreply(可选): 该参数告知服务器不需要返回数据
  • value:存储的值(始终位于第二行)(可直接理解为key-value结构中的value)

实例如下:

首先我们在 Memcached 中存储一个键 test,其值为 memcached。
然后,我们使用 get 命令检索该值。
然后,我们使用 append 命令在键为 test 的值后面追加 "redis"。
最后,我们再使用 get 命令检索该值。
set test 0 900 9
memcached
STORED
get test
VALUE test 0 9
memcached
END
append test 0 900 5
redis
STORED
get test
VALUE test 0 14
memcachedredis
END

Memcached递增递减incr和decr

Memcached incr 与 decr 命令用于对已存在的 key(键) 的数字值进行自增或自减操作。

incr 与 decr 命令操作的数据必须是十进制的32位无符号整数。

如果 key 不存在返回 NOT_FOUND,如果键的值不为数字,则返回 CLIENT_ERROR,其他错误返回 ERROR。

//增加
incr key increment_value
//减少
decr key decrement_value
set val 0 900 2
10
STORED
get val
VALUE val 0 2
10
END
incr val 10
20
get val
VALUE val 0 2
20
END
decr val 15
5
get val
VALUE val 0 2
5 
END

 

posted on 2017-06-26 21:53  gimin  阅读(617)  评论(0编辑  收藏  举报