目录
1. gets
命令简介
gets
命令是 Memcached 提供的一种获取键值的命令,与 get
命令类似,但不同的是,gets
命令不仅返回键的值,还会返回CAS 唯一版本号。
CAS(Check And Set)版本号是 Memcached 用来确保原子操作和数据一致性的一种机制,可以在进行更新操作时判断是否有其他客户端修改了该数据。
gets
命令主要用于获取数据并提供 CAS 唯一版本号,这对于后续的 cas
操作非常有用。
2. gets
命令的语法
gets <key1> <key2> ... <keyN>
<key1> <key2> ... <keyN>
:你要获取的一个或多个键名。
3. gets
命令的参数说明
参数 | 说明 | 示例 |
---|---|---|
<key> | 要获取的键(可以是一个或多个) | user , counter |
4. 使用 Telnet 进行 gets
操作
4.1 连接 Memcached
telnet 127.0.0.1 11211
4.2 存储一些键值(使用 set
)
set user 0 0 5
Alice
set counter 0 0 2
10
4.3 使用 gets
获取一个键的值和 CAS 唯一版本号
gets user
返回结果:
VALUE user 0 5 1234567890
Alice
END
其中 1234567890
是 CAS 唯一版本号。
4.4 使用 gets
获取多个键的值和 CAS 唯一版本号
gets user counter
返回结果:
VALUE user 0 5 1234567890
Alice
VALUE counter 0 2 9876543210
10
END
其中 1234567890
和 9876543210
分别是 user
和 counter
的 CAS 唯一版本号。
4.5 使用 gets
获取一个不存在的键
gets non_existent_key
返回结果:
END
表示该键不存在。
5. 不同编程语言的 gets
示例
5.1 PHP gets
示例
<?php
$memcached = new Memcached();
$memcached->addServer("127.0.0.1", 11211);
// 存储数据
$memcached->set("user", "Alice");
$memcached->set("counter", 10);
// 获取单个键的值和 CAS 唯一版本号
$cas_token = null;
$user = $memcached->gets("user", null, $cas_token);
echo "User: " . $user . "\n"; // 输出: Alice
echo "CAS Token: " . $cas_token . "\n"; // 输出: CAS 唯一版本号
// 获取多个键的值和 CAS 唯一版本号
$values = $memcached->getMulti(["user", "counter"], null, $cas_token);
echo "User: " . $values["user"] . "\n"; // 输出: Alice
echo "Counter: " . $values["counter"] . "\n"; // 输出: 10
?>
5.2 Python gets
示例
from pymemcache.client import base
client = base.Client(('127.0.0.1', 11211))
# 存储数据
client.set('user', 'Alice')
client.set('counter', 10)
# 获取单个键的值和 CAS 唯一版本号
user, cas_token = client.gets('user')
print(f"User: {user.decode('utf-8')}, CAS Token: {cas_token}")
# 获取多个键的值和 CAS 唯一版本号
keys = ['user', 'counter']
values = client.gets_multi(keys)
for key, value in values.items():
print(f"{key}: {value[0].decode('utf-8')}, CAS Token: {value[1]}")
5.3 Java gets
示例
import net.spy.memcached.MemcachedClient;
import java.io.IOException;
import java.net.InetSocketAddress;
public class MemcachedTest {
public static void main(String[] args) throws IOException {
MemcachedClient client = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
// 存储数据
client.set("user", 0, "Alice");
client.set("counter", 0, 10);
// 获取单个键的值和 CAS 唯一版本号
Object[] result = (Object[]) client.gets("user");
String user = (String) result[0];
Long casToken = (Long) result[1];
System.out.println("User: " + user + ", CAS Token: " + casToken); // 输出: Alice, CAS Token
// 获取多个键的值和 CAS 唯一版本号
Object[] results = (Object[]) client.gets("user", "counter");
String userValue = (String) results[0];
String counterValue = (String) results[1];
System.out.println("User: " + userValue + ", Counter: " + counterValue); // 输出: Alice, 10
client.shutdown();
}
}
5.4 Node.js gets
示例
const Memcached = require('memcached');
const memcached = new Memcached("127.0.0.1:11211");
// 存储数据
memcached.set("user", "Alice", 0, function(err) {
if (err) console.error(err);
// 获取单个键的值和 CAS 唯一版本号
memcached.gets("user", function(err, data) {
if (err) console.error(err);
console.log("User: " + data.value + ", CAS Token: " + data.cas);
});
// 获取多个键的值和 CAS 唯一版本号
memcached.gets(["user", "counter"], function(err, data) {
if (err) console.error(err);
console.log("User: " + data.user.value + ", CAS Token: " + data.user.cas);
console.log("Counter: " + data.counter.value + ", CAS Token: " + data.counter.cas);
});
});
发表回复