Memcached - CAS 命令



CAS 代表检查并设置 (Check-And-Set) 或比较并交换 (Compare-And-Swap)。Memcached 的 CAS 命令用于在数据自上次获取以来未更新的情况下设置数据。如果 Memcached 中不存在该键,则返回 NOT_FOUND

语法

Memcached CAS 命令的基本语法如下所示:

set key flags exptime bytes unique_cas_key [noreply]
value

语法中的关键词说明如下:

  • key − 它是用于存储和检索 Memcached 中数据的键的名称。

  • flags − 它是服务器与用户提供的数据一起存储的 32 位无符号整数,并在检索项目时与数据一起返回。

  • exptime − 它是以秒为单位的过期时间。0 表示不延迟。如果 exptime 超过 30 天,Memcached 将其用作过期时间的 UNIX 时间戳。

  • bytes − 它是需要存储的数据块中的字节数。这是需要存储在 Memcached 中的数据长度。

  • unique_cas_key − 它是从 gets 命令获取的唯一键。

  • noreply (可选) − 它是一个参数,通知服务器不要发送任何回复。

  • value − 它是需要存储的数据。在使用上述选项执行命令后,需要在新行上传递数据。

输出

命令的输出如下所示:

STORED
  • STORED 表示成功。

  • ERROR 表示保存数据时出错或语法错误。

  • EXISTS 表示自上次获取以来有人修改了 CAS 数据。

  • NOT_FOUND 表示 Memcached 服务器中不存在该键。

示例

要在 Memcached 中执行 CAS 命令,您需要从 Memcached gets 命令获取 CAS 令牌。

cas tp 0 900 9
ERROR
cas tp 0 900 9 2
memcached
set tp 0 900 9
memcached
STORED
gets tp
VALUE tp 0 9 1
memcached
END
cas tp 0 900 5 2
redis
EXISTS
cas tp 0 900 5 1
redis
STORED
get tp
VALUE tp 0 5
redis
END

使用 Java 应用程序的 CAS

要从 Memcached 服务器获取 CAS 数据,您需要使用 Memcached 的 gets 方法。

示例

import net.spy.memcached.MemcachedClient;
public class MemcachedJava {
   public static void main(String[] args) {
     
     // Connecting to Memcached server on localhost
      MemcachedClient mcc = new MemcachedClient(new
      InetSocketAddress("127.0.0.1", 11211));
      System.out.println("Connection to server successful");
      System.out.println("set status:"+mcc.set("tutorialspoint", 900, "memcached").isDone());

      // Get cas token from cache
      long castToken = mcc.gets("tutorialspoint").cas;
      System.out.println("Cas token:"+castToken);

      // now set new data in memcached server
      System.out.println("Now set new data:"+mcc.cas("tutorialspoint",
      castToken, 900, "redis"));
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

输出

编译并执行程序后,您将看到以下输出:

Connection to server successful
set status:true
Cas token:3
Now set new data:OK
Get from Cache:redis
广告