目录

  1. gets 命令简介
  2. gets 命令的语法
  3. gets 命令的参数说明
  4. 使用 Telnet 进行 gets 操作
  5. 不同编程语言的 gets 示例
  6. 参考资料

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

其中 12345678909876543210 分别是 usercounter 的 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);
    });
});


6. 参考资料