Skip to content

Memcached - 删除数据

delete 命令用于从 Memcached 服务器中移除一个已存在的键值对(key-value pair)。此操作对于缓存失效(cache invalidation)策略至关重要。

通过 telnet 连接执行 delete 命令的基本语法是:

delete key [noreply]

服务器会返回以下响应之一:

  • DELETED:键已找到并成功移除。
  • NOT_FOUND:键在服务器上不存在。
  • ERROR:表示命令语法错误。

在此示例中,我们将使用 telnet 连接到 Memcached 服务器。首先,我们设置一个名为 session_token 的键,验证它是否存在,然后删除它,并再次验证它已被移除。

# First, set a key-value pair
set session_token 0 3600 36
xyz-abc-123-789-pqr-lmn-456-def
STORED
# Retrieve the key to confirm it's there
get session_token
VALUE session_token 0 36
xyz-abc-123-789-pqr-lmn-456-def
END
# Now, delete the key
delete session_token
DELETED
# Try to retrieve the key again
get session_token
END
# Try to delete the same key again
delete session_token
NOT_FOUND

在实际应用中,您会使用客户端库(client library)与 Memcached 交互。这里,我们将使用流行的 Java 客户端 spymemcached。现代的做法是使用 Maven 或 Gradle 等构建工具(build tool)管理依赖(dependencies),并安全地处理资源。

如果您使用 Maven,请将 spymemcached 依赖添加到您的 pom.xml 中:

<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version> <!-- Use the latest stable version -->
</dependency>

此示例演示了如何连接到服务器,设置一个值,确认其存在,删除它,然后确认其已被删除。我们使用 try-with-resources 块来确保客户端连接始终正确关闭。

import net.spy.memcached.MemcachedClient;
import net.spy.memcached.AddrUtil;
import net.spy.memcached.internal.OperationFuture;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
public class MemcachedDeleteExample {
public static void main(String[] args) {
String serverAddress = "127.0.0.1:11211";
String key = "user:123:profile";
String value = "{"name":"John Doe", "email":"john.doe@example.com"}";
int expiration = 3600; // 1 hour
try (MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses(serverAddress))) {
System.out.println("Connection to Memcached server successful.");
// 1. 设置一个稍后将删除的值
OperationFuture<Boolean> setFuture = client.set(key, expiration, value);
if (setFuture.get()) {
System.out.println("Successfully set key '" + key + "'.");
} else {
System.err.println("Failed to set key '" + key + "'.");
return;
}
// 2. 验证值是否存在
Object retrievedValue = client.get(key);
System.out.println("Retrieved value before delete: " + retrievedValue);
// 3. 删除该值
OperationFuture<Boolean> deleteFuture = client.delete(key);
if (deleteFuture.get()) {
System.out.println("Successfully deleted key '" + key + "'.");
} else {
System.out.println("Failed to delete key '" + key + "' (it may not have existed).");
}
// 4. 验证值现在是否为 null
retrievedValue = client.get(key);
System.out.println("Retrieved value after delete: " + retrievedValue);
} catch (IOException | InterruptedException | ExecutionException e) {
System.err.println("发生错误: " + e.getMessage());
// 在实际应用中,您会记录此异常
Thread.currentThread().interrupt();
}
}
}

当您编译并运行上述程序时,您应该看到以下输出:

Connection to Memcached server successful.
Successfully set key 'user:123:profile'.
Retrieved value before delete: {"name":"John Doe", "email":"john.doe@example.com"}
Successfully deleted key 'user:123:profile'.
Retrieved value after delete: null
  • 缓存失效(Cache Invalidation):当数据源(例如数据库记录)更新或删除时,使用 delete 从缓存中移除过时数据。
  • 错误处理(Error Handling):delete 返回的 Future 可能会失败。始终检查结果并处理潜在异常(exceptions),以构建健壮的应用程序(robust application)。
  • 资源管理(Resource Management):始终关闭您的 Memcached 客户端连接以释放网络资源。在 Java 中,使用 try-with-resources 语句是推荐的做法。