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