Memcached 简明教程

Memcached - Quick Guide

Memcached - Overview

Memcached 是一个开源、高性能的分布式内存缓存系统,旨在通过减轻数据库负载来加速动态 Web 应用程序。它是一个存储在内存中的字符串、对象等键值对字典,源自数据库调用、API 调用或页面渲染。

Memcached 于 2003 年由 Brad Fitzpatrick 为 LiveJournal 开发。然而,它现在正被 Netlog、Facebook、Flickr、Wikipedia、Twitter 和 YouTube 等公司使用。

Memcached 的主要特性如下:

  1. It is open source.

  2. Memcached 服务器是一个巨大的哈希表。

  3. 它显著减轻了数据库负载

  4. 对于数据库负载高的网站而言,它非常高效。

  5. 它在伯克利软件发行版 (BSD) 许可证下分发。

  6. 它是一个基于 TCP 或 UDP 的客户端-服务器应用程序。

Memcached is not −

  1. a persistent data store

  2. a database

  3. application-specific

  4. a large object cache

  5. fault-tolerant or highly available

Memcached - Environment

Installing Memcached on Ubuntu

要在 Ubuntu 上安装 Memcached,请进入终端并键入以下命令:

$sudo apt-get update
$sudo apt-get install memcached

Confirming Memcached Installation

要确认 Memcached 是否已安装,您需要运行以下给定的命令。此命令表示 Memcached 正在默认端口 11211 上运行。

$ps aux | grep memcached

要在不同的端口上运行 Memcached 服务器,请执行下面给出的命令。此命令在 TCP 端口 11111 上启动服务器,并在 UDP 端口 11111 上监听,作为一个守护进程。

$memcached -p 11111 -U 11111 -u user -d

您可以通过一次安装运行 memcached 服务器的多个实例。

Memcached Java Environment Setup

在您的 Java 程序中使用 Memcached,您需要下载 * spymemcached-2.10.3.jar* ,并将此 jar 设置到类路径中。

Memcached - Connection

要连接到 Memcached 服务器,您需要在 HOST 和 PORT 名称上使用 telnet 命令。

Syntax

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

$telnet HOST PORT

此处 HOSTPORT 分别是 Memcached 服务器正在执行的机器的 IP 和端口号。

Example

以下示例演示如何连接到 Memcached 服务器并执行一个简单的设定和获取命令。假设 Memcached 服务器正在主机 127.0.0.1 和端口 11211 上运行。

$telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
// now store some data and get it from memcached server
set tutorialspoint 0 900 9
memcached
STORED
get tutorialspoint
VALUE tutorialspoint 0 9
memcached
END

Connection from Java Application

要从您的 java 程序连接 Memcached 服务器,您需要将 Memcached jar 添加到您的类路径中,如前一章所示。假设 Memcached 服务器正在主机 127.0.0.1 和端口 11211 上运行。-

Example

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 sucessfully");

      //not set data into memcached server
      System.out.println("set status:"+mcc.set("tutorialspoint", 900, "memcached").done);

      //Get value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:memcached.

终端可能还会显示一些信息消息,这些消息可以忽略。

Memcached - Set Data

Memcached set 命令用于为新键或现有键设置新值。

Syntax

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

set key flags exptime bytes [noreply]
value

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

  1. key :这是数据在 Memcached 中存储和从中检索的键的名称。

  2. flags :它是一个 32 位无符号整数,服务器与用户提供的数据一起存储该整数,并在检索该项时与该数据一同返回。

  3. exptime :它是以秒为单位的过期时间。0 表示无延迟。如果 exptime 超过 30 天,则 Memcached 会将其用作过期的 UNIX 时间戳。

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

  5. noreply (optional) - 这是一个参数,通知服务器不发送任何回复。

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

Output

命令的输出如下所示:

STORED
  1. STORED indicates success.

  2. ERROR 指示在保存数据时语法不正确或出错。

Example

在以下示例中,我们将 tutorialspoint 用作键,并将值 Memcached 设置为其值,其过期时间为 900 秒。

set tutorialspoint 0 900 9
memcached
STORED
get tutorialspoint
VALUE tutorialspoint 0 9
Memcached
END

Set Data Using Java Application

要在 Memcached 服务器中设置键,您需要使用 Memcached set 方法。

Example

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 sucessfully");
      System.out.println("set status:"+mcc.set("tutorialspoint", 900, "memcached").done);

      // Get value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:memcached

Memcached - Add Data

Memcached add 命令用于为新键设置值。如果键已存在,则它给出输出 NOT_STORED。

Syntax

Memcached add 的基本语法如下所示 −

add key flags exptime bytes [noreply]
value

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

  1. key :这是数据在 Memcached 中存储和从中检索的键的名称。

  2. flags :它是一个 32 位无符号整数,服务器与用户提供的数据一起存储该整数,并在检索该项时与该数据一同返回。

  3. exptime − 是以秒计的过期时间。0 表示无延迟。如果 exptime 超过 30 天,则 Memcached 会将其用作过期的 UNIX 时间戳。

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

  5. noreply (optional) − 是通知服务器不发送任何回复的参数。

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

Output

命令的输出如下所示:

STORED
  1. STORED indicates success.

  2. NOT_STORED 表示数据没有存储在 Memcached 中。

Example

在以下示例中,我们使用“key”作为键,并以 900 秒的过期时间在其内添加值 Memcached。

add key 0 900 9
memcached
STORED
get key
VALUE key 0 9
Memcached
END

Failure Output

add key 0 900 5
redis
NOT_STORED

Add Data Using Java Application

若要将数据添加到 Memcached 服务器,您需要使用 Memcached add 方法。

Example

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("add status:"+mcc.add("tutorialspoint", 900, "redis").done);
      System.out.println("add status:"+mcc.add("tp", 900, "redis").done);

      // Get value from cache
      System.out.println("Get from Cache tp:"+mcc.get("tp"));
   }
}

Output

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

Connection to server successful
add status:false
add status:true
Get from Cache tp:redis

Memcached - Replace Data

Memcached replace 命令用于替换现有键的值。如果键不存在,则会输出 NOT_STORED。

Syntax

Memcached replace 的基本语法如下所示 −

replace key flags exptime bytes [noreply]
value

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

  1. key :这是数据在 Memcached 中存储和从中检索的键的名称。

  2. flags :它是一个 32 位无符号整数,服务器与用户提供的数据一起存储该整数,并在检索该项时与该数据一同返回。

  3. exptime − 是以秒计的过期时间。0 表示无延迟。如果 exptime 超过 30 天,则 Memcached 会将其用作过期的 UNIX 时间戳。

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

  5. noreply (optional) − 是通知服务器不发送任何回复的参数。

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

Output

命令的输出如下所示:

STORED
  1. STORED indicates success.

  2. NOT_STORED 表示数据没有存储在 Memcached 中。

Example

在以下示例中,我们使用“key”作为键,并以 900 秒的过期时间在其内存储 memcached。此后,将使用值“redis”替换相同的键。

add key 0 900 9
memcached
STORED
get key
VALUE key 0 9
memcached
END
replace key 0 900 5
redis
get key
VALUE key 0 5
redis
END

Replace Data Using Java Application

若要替换 Memcached 服务器中的数据,您需要使用 Memcached replace 方法。

Example

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 sucessfully");
      System.out.println("set status:"+mcc.set("tutorialspoint", 900, "memcached").done);

      // Get value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));

      // now replace the existing data
      System.out.println("Replace cache:"+mcc.replace("tutorialspoint", 900, "redis").done);

      // get the updated data
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:memcached
Replace cache:true
Get from Cache:redis

Memcached - Append Data

Memcached append 命令用于在现有键中添加一些数据。将在键的现有数据后存储数据。

Syntax

Memcached append 的基本语法如下所示 −

append key flags exptime bytes [noreply]
value

语法中的关键字的说明如下−

  1. key :这是数据在 Memcached 中存储和从中检索的键的名称。

  2. flags :它是一个 32 位无符号整数,服务器与用户提供的数据一起存储该整数,并在检索该项时与该数据一同返回。

  3. exptime − 是以秒计的过期时间。0 表示无延迟。如果 exptime 超过 30 天,则 Memcached 会将其用作过期的 UNIX 时间戳。

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

  5. noreply (optional) − 是通知服务器不发送任何回复的参数。

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

Output

命令的输出如下所示:

STORED
  1. STORED indicates success.

  2. NOT_STORED 表示键在 Memcached 服务器中不存在。

  3. CLIENT_ERROR indicates error.

Example

在以下示例中,我们尝试向一个不存在的键添加一些数据。因此,Memcached 返回 NOT_STORED 。在此之后,我们设置一个键并将数据追加到其中。

append tutorials 0 900 5
redis
NOT_STORED
set tutorials 0 900 9
memcached
STORED
get tutorials
VALUE tutorials 0 14
memcached
END
append tutorials 0 900 5
redis
STORED
get tutorials
VALUE tutorials 0 14
memcachedredis
END

Append Data Using Java Application

若要将数据追加到 Memcached 服务器,您需要使用 Memcached append 方法。

Example

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 value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));

      // now append some data into existing key
      System.out.println("Append to cache:"+mcc.append("tutorialspoint", "redis").isDone());

      // get the updated key
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successful
set status:true
Get from Cache:memcached
Append to cache:true
Get from Cache:memcachedredis

Memcached - Prepend Data

Memcached prepend 命令用于在现有键中添加一些数据。将在键的现有数据前存储数据。

Syntax

Memcached prepend 命令的基本语法如下所示 −

prepend key flags exptime bytes [noreply]
value

语法中的关键字的说明如下−

  1. key − 它是按键存储和检索 Memcached 中的数据的名称。

  2. flags :它是一个 32 位无符号整数,服务器与用户提供的数据一起存储该整数,并在检索该项时与该数据一同返回。

  3. exptime − 是以秒计的过期时间。0 表示无延迟。如果 exptime 超过 30 天,则 Memcached 会将其用作过期的 UNIX 时间戳。

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

  5. noreply (optional) − 这个参数通知服务器不要发送任何回复。

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

Output

命令的输出如下所示:

STORED
  1. STORED indicates success.

  2. NOT_STORED 表示键在 Memcached 服务器中不存在。

  3. CLIENT_ERROR indicates error.

Example

在以下示例中,我们在不存在的密钥中添加了一些数据。因此,Memcached 返回 NOT_STORED 。在此之后,我们设置一个密钥并在其中置入数据。

prepend tutorials 0 900 5
redis
NOT_STORED
set tutorials 0 900 9
memcached
STORED
get tutorials
VALUE tutorials 0 14
memcached
END
prepend tutorials 0 900 5
redis
STORED
get tutorials
VALUE tutorials 0 14
redismemcached
END

Prepend Data Using Java Application

要向 Memcached 服务器中置入数据,你需要使用 Memcached prepend 方法。

Example

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 value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));

      // now append some data into existing key
      System.out.println("Prepend to cache:"+mcc.prepend("tutorialspoint", "redis").isDone());

      // get the updated key
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successful
set status:true
Get from Cache:memcached
Prepend to cache:true
Get from Cache:redismemcached

Memcached - CAS Command

CAS 代表 Check-And-Set 或 Compare-And-Swap。Memcached CAS 命令用于在数据自上次获取以来未更新时设置数据。如果密钥不存在于 Memcached 中,则它返回 NOT_FOUND

Syntax

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

set key flags exptime bytes unique_cas_key [noreply]
value

语法中的关键字的说明如下−

  1. key :这是数据在 Memcached 中存储和从中检索的键的名称。

  2. flags :它是一个 32 位无符号整数,服务器与用户提供的数据一起存储该整数,并在检索该项时与该数据一同返回。

  3. exptime − 是以秒计的过期时间。0 表示无延迟。如果 exptime 超过 30 天,则 Memcached 会将其用作过期的 UNIX 时间戳。

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

  5. unique_cas_key − 从 gets 命令中获得的唯一密钥。

  6. noreply (optional) − 是通知服务器不发送任何回复的参数。

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

Output

命令的输出如下所示:

STORED
  1. STORED indicates success.

  2. ERROR 指示保存数据或语法错误时出错。

  3. EXISTS 指示自上次获取以来有人修改了 CAS 数据。

  4. NOT_FOUND 指示密钥不存在于 Memcached 服务器中。

Example

要在 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

CAS Using Java Application

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

Example

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"));
   }
}

Output

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

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

Memcached - Get Data

Memcached get 命令用于获取存储在密钥上的值。如果密钥不存在于 Memcached 中,则它不会返回任何内容。

Syntax

Memcached get 命令的基本语法如下所示 −

get key

Example

在以下示例中,我们使用 tutorialspoint 作为密钥,并在其中存储 memcached,其过期时间为 900 秒。

set tutorialspoint 0 900 9
memcached
STORED
get tutorialspoint
VALUE tutorialspoint 0 9
memcached
END

Get Data Using Java Application

要从 Memcached 服务器获取数据,你需要使用 Memcached get 方法。

Example

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 sucessfully");
      System.out.println("set status:"+mcc.set("tutorialspoint", 900, "memcached").done);

     // Get value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:memcached

Memcached - Get CAS Data

Memcached gets 命令用于获取带有 CAS 令牌的值。如果 Memcached 中不存在该密钥,则它将不返回任何内容。

Syntax

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

get key

Example

set tutorialspoint 0 900 9
memcached
STORED
gets tutorialspoint
VALUE tutorialspoint 0 9 1
memcached
END

在此示例中,我们使用 tutorialspoint 作为密钥,并将 memcached 存储在其中,其到期时间为 900 秒。

Get CAS Data Using Java Application

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

Example

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 sucessfully");
      System.out.println("set status:"+mcc.set("tutorialspoint", 900, "memcached").done);

      // Get value from cache
      System.out.println("Get from Cache:"+mcc.gets("tutorialspoint"));
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:{CasValue 2/memcached}

Memcached - Delete Key

Memcached delete 命令用于从 Memcached 服务器中删除现有密钥。

Syntax

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

delete key [noreply]

Output

CAS 命令可能生成以下结果之一:

  1. DELETED indicates successful deletion.

  2. ERROR 表示在删除数据或语法错误时出现错误。

  3. NOT_FOUND 指示密钥不存在于 Memcached 服务器中。

Example

在此示例中,我们使用 tutorialspoint 作为密钥,并将 memcached 存储在其中,其到期时间为 900 秒。此后,它将删除存储的密钥。

set tutorialspoint 0 900 9
memcached
STORED
get tutorialspoint
VALUE tutorialspoint 0 9
memcached
END
delete tutorialspoint
DELETED
get tutorialspoint
END
delete tutorialspoint
NOT_FOUND

Delete Data Using Java Application

若要从 Memcached 服务器删除数据,您需要使用 Memcached delete 方法。

Example

import java.net.InetSocketAddress;
import java.util.concurrent.Future;

import net.spy.memcached.MemcachedClient;

public class MemcachedJava {
   public static void main(String[] args) {

      try{

         // Connecting to Memcached server on localhost
         MemcachedClient mcc = new MemcachedClient(new InetSocketAddress("127.0.0.1", 11211));
         System.out.println("Connection to server sucessful.");

         // add data to memcached server
         Future fo = mcc.set("tutorialspoint", 900, "World's largest online tutorials library");

         // print status of set method
         System.out.println("set status:" + fo.get());

         // retrieve and check the value from cache
         System.out.println("tutorialspoint value in cache - " + mcc.get("tutorialspoint"));

         // try to add data with existing key
         Future fo = mcc.delete("tutorialspoint");

         // print status of delete method
         System.out.println("delete status:" + fo.get());

         // retrieve and check the value from cache
         System.out.println("tutorialspoint value in cache - " + mcc.get("codingground"));

         // Shutdowns the memcached client
         mcc.shutdown();

      }catch(Exception ex)
         System.out.println(ex.getMessage());
   }
}

Output

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

Connection to server successful
set status:true
tutorialspoint value in cache - World's largest online tutorials library
delete status:true
tutorialspoint value in cache - null

Memcached - Delete data

Memcached delete 命令用于从 Memcached 服务器中删除现有密钥。

Syntax

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

delete key

如果成功删除该密钥,则它将返回 DELETED。如果未找到该密钥,则它将返回 NOT_FOUND,否则将返回 ERROR。

Example

在此示例中,我们使用 tutorialspoint 作为密钥,并将 memcached 存储在其中,其到期时间为 900 秒。此后,它将删除存储的密钥。

set tutorialspoint 0 900 9
memcached
STORED
get tutorialspoint
VALUE tutorialspoint 0 9
memcached
END
delete tutorialspoint
DELETED
get tutorialspoint
END
delete tutorialspoint
NOT_FOUND

Delete Data Using Java Application

若要从 Memcached 服务器删除数据,您需要使用 Memcached delete 方法。

Example

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").done);

      // Get value from cache
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));

      // delete value from cache
      System.out.println("Delete from Cache:"+mcc.delete("tutorialspoint").isDone());

      // check whether value exists or not
      System.out.println("Get from Cache:"+mcc.get("tutorialspoint"));
   }
}

Output

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

Connection to server successful
set status:true
Get from Cache:memcached
Delete from Cache:true
Get from Cache:null

Memcached - Increment Decrement Data

Memcached incrdecr 命令用于增加或减少现有密钥的数值。如果未找到该密钥,则它将返回 NOT_FOUND 。如果该密钥不是数字,则它将返回 CLIENT_ERROR cannot increment or decrement non-numeric value 。否则,将返回 ERROR

Syntax - incr

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

incr key increment_value

Example

在此示例中,我们使用 visitors 作为密钥,并最初在其中设置 10,然后将其增加 5。

set visitors 0 900 2
10
STORED
get visitors
VALUE visitors 0 2
10
END
incr visitors 5
15
get visitors
VALUE visitors 0 2
15
END

Syntax - decr

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

decr key decrement_value

Example

set visitors 0 900 2
10
STORED
get visitors
VALUE visitors 0 2
10
END
decr visitors 5
5
get visitors
VALUE visitors 0 1
5
END

Incr/Decr Using Java Application

若要在 Memcached 服务器中增加或减少数据,您需要分别使用 Memcached incr or decr 方法。

Example

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 sucessfully");
      System.out.println("set status:"+mcc.set("count", 900, "5").isDone());

      // Get value from cache
      System.out.println("Get from Cache:"+mcc.get("count"));

      // now increase the stored value
      System.out.println("Increment value:"+mcc.incr("count", 2));

      // now decrease the stored value
      System.out.println("Decrement value:"+mcc.decr("count", 1));

      // now get the final stored value
      System.out.println("Get from Cache:"+mcc.get("count"));
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:5
Increment value:7
Decrement value:6
Get from Cache:6

Memcached - Stats

Memcached stats 命令用于返回服务器统计信息,如 PID、版本、连接等。

Syntax

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

stats

Example

stats
STAT pid 1162
STAT uptime 5022
STAT time 1415208270
STAT version 1.4.14
STAT libevent 2.0.19-stable
STAT pointer_size 64
STAT rusage_user 0.096006
STAT rusage_system 0.152009
STAT curr_connections 5
STAT total_connections 6

STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 6
STAT cmd_set 4
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 4
STAT get_misses 2
STAT delete_misses 1
STAT delete_hits 1

STAT incr_misses 2
STAT incr_hits 1
STAT decr_misses 0
STAT decr_hits 1
STAT cas_misses 0
STAT cas_hits 0
STAT cas_badval 0
STAT touch_hits 0
STAT touch_misses 0
STAT auth_cmds 0

STAT auth_errors 0
STAT bytes_read 262
STAT bytes_written 313
STAT limit_maxbytes 67108864
STAT accepting_conns 1
STAT listen_disabled_num 0
STAT threads 4
STAT conn_yields 0
STAT hash_power_level 16

STAT hash_bytes 524288
STAT hash_is_expanding 0
STAT expired_unfetched 1
STAT evicted_unfetched 0
STAT bytes 142
STAT curr_items 2
STAT total_items 6
STAT evictions 0
STAT reclaimed 1
END

Stats Using Java Application

要从 Memcached 服务器获取统计信息,您需要使用 Memcached stats 方法。

Example

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("Stats:"+mcc.stats);
   }
}

Output

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

Connection to server successful
Stats:[/127.0.0.1:11211:[delete_hits:0, bytes:71, total_items:4,
rusage_system:0.220013, touch_misses:0, cmd_touch:0, listen_disabled_num:0,
auth_errors:0, evictions:0, version:1.4.14, pointer_size:64, time:1417279366,
incr_hits:1, threads:4, expired_unfetched:0, limit_maxbytes:67108864,
hash_is_expanding:0, bytes_read:170, curr_connections:8, get_misses:1,
reclaimed:0, bytes_written:225, hash_power_level:16, connection_structures:9,
cas_hits:0, delete_misses:0, total_connections:11, rusage_user:0.356022,
cmd_flush:0, libevent:2.0.19-stable, uptime:12015, reserved_fds:20,
touch_hits:0, cas_badval:0, pid:1138, get_hits:2, curr_items:1, cas_misses:0,
accepting_conns:1, evicted_unfetched:0, cmd_get:3, cmd_set:2, auth_cmds:0,
incr_misses:1, hash_bytes:524288, decr_misses:1, decr_hits:1, conn_yields:0]]

Memcached - Stats Items

Memcached stats items 命令用于获取按 slab ID 组织的各项统计信息,如计数、年龄、驱逐等。

Syntax

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

stats items

Example

stats items
STAT items:1:number 1
STAT items:1:age 7
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
END

Memcached - Stats Slabs

Memcached stats slabs 命令显示 Slab 统计信息,例如大小、内存使用情况、命令、数量等,并按 Slab 编号排列。

Syntax

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

stats slabs

Example

stats slabs
STAT 1:chunk_size 96
STAT 1:chunks_per_page 10922
STAT 1:total_pages 1
STAT 1:total_chunks 10922
STAT 1:used_chunks 1
STAT 1:free_chunks 10921
STAT 1:free_chunks_end 0
STAT 1:mem_requested 71
STAT 1:get_hits 0
STAT 1:cmd_set 1
STAT 1:delete_hits 0
STAT 1:incr_hits 0
STAT 1:decr_hits 0
STAT 1:cas_hits 0
STAT 1:cas_badval 0
STAT 1:touch_hits 0
STAT active_slabs 1
STAT total_malloced 1048512
END

Memcached - Stats Sizes

Memcached stats sizes 命令提供有关缓存中各个大小的项目大小和数量的信息。信息在两列中返回。第一列是项目大小(向上舍入到最接近的 32 字节边界),第二列是缓存中该大小的项目数量。

Syntax

Memcached stats sizes 命令的基本语法如下所示 −

stats sizes

Example

stats sizes
STAT 96 1
END

项目大小统计信息仅可用于确定你正在存储的对象的大小。由于实际的内存分配仅与块大小和页面大小相关,所以该信息只有在仔细调试或诊断会话中才有用。

Memcached - Clear Data

Memcached flush_all 命令用于从 Memcached 服务器删除所有数据(键值对)。它接受一个名为 time 的可选参数,该参数设置一个时间,在此时间之后将清除 Memcached 数据。

Syntax

Memcached flush_all 命令的基本语法如下所示 −

flush_all [time] [noreply]

以上命令始终返回 OK。

Example

在下面的示例中,我们将一些数据存储到 Memcached 服务器,然后清除所有数据。

set tutorialspoint 0 900 9
memcached
STORED
get tutorialspoint
VALUE tutorialspoint 0 9
memcached
END
flush_all
OK
get tutorialspoint
END

Clear Data Using Java Application

要从 Memcached 服务器清除数据,你需要使用 Memcached flush 方法。

Example

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 sucessfully");
      System.out.println("set status:"+mcc.set("count", 900, "5").isDone());

      // Get value from cache
      System.out.println("Get from Cache:"+mcc.get("count"));

      // now increase the stored value
      System.out.println("Increment value:"+mcc.incr("count", 2));

      // now decrease the stored value
      System.out.println("Decrement value:"+mcc.decr("count", 1));

      // now get the final stored value
      System.out.println("Get from Cache:"+mcc.get("count"));

      // now clear all this data
      System.out.println("Clear data:"+mcc.flush().isDone());
   }
}

Output

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

Connection to server successfully
set status:true
Get from Cache:5
Increment value:7
Decrement value:6
Get from Cache:6
Clear data:true