Skip to content

Memcached - 清除数据

flush_all 命令会立即或在指定延迟后使 Memcached 服务器中的所有现有项失效(invalidate)。这是一个强大但具有破坏性(destructive)的命令,应特别谨慎使用,尤其是在生产环境中。

执行 flush_all 将清除该 Memcached 实例的整个缓存。这可能导致“惊群效应(thundering herd)”问题,即大量请求突然涌向您的后端数据库(backend database)或服务,可能导致它们过载(overwhelming)。此命令通常在开发或测试环境中使用,以重置缓存状态。

flush_all 命令的基本语法是:

flush_all [delay] [noreply]

可选的 delay 参数指定一个秒数,在此秒数之后所有项将失效。服务器始终响应 OK。

在此示例中,我们设置几个键,验证它们是否存在,然后刷新(flush)缓存并确认它们已被清除。

# Set some data
set key1 0 900 5
hello
STORED
set key2 0 900 5
world
STORED
# Verify data exists
get key1
VALUE key1 0 5
hello
END
# Flush the entire cache
flush_all
OK
# Attempt to get the data again
get key1
END
get key2
END

现代客户端库提供了 flush() 方法来执行此命令。以下示例展示了如何在 Java 应用程序中使用 spymemcached 执行此操作。

确保您的 Maven pom.xml 中包含 spymemcached 依赖:

<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version>
</dependency>

此程序设置两个键,验证它们的存在,调用 flush(),然后确认这些键已失效。

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 MemcachedFlushExample {
public static void main(String[] args) {
String serverAddress = "127.0.0.1:11211";
try (MemcachedClient client = new MemcachedClient(AddrUtil.getAddresses(serverAddress))) {
System.out.println("Connection to Memcached server successful.");
// 1. 设置几个键
client.set("config:feature_flags", 0, "{\"new_dashboard\": true}").get();
client.set("user:45:session", 0, "active").get();
System.out.println("Set initial keys: 'config:feature_flags' and 'user:45:session'.");
// 2. 在刷新前验证键是否存在
System.out.println("Value of 'config:feature_flags' before flush: " + client.get("config:feature_flags"));
System.out.println("Value of 'user:45:session' before flush: " + client.get("user:45:session"));
// 3. 刷新缓存
System.out.println("\n--- Flushing the cache --- ");
OperationFuture<Boolean> flushFuture = client.flush();
if (flushFuture.get()) {
System.out.println("Cache flush command sent successfully.");
} else {
System.err.println("Cache flush failed.");
}
// 注意:刷新操作可能不是即时的。
Thread.sleep(100); // 短暂延迟以允许刷新操作传播
// 4. 刷新后验证键是否已清除
System.out.println("Value of 'config:feature_flags' after flush: " + client.get("config:feature_flags"));
System.out.println("Value of 'user:45:session' after flush: " + client.get("user:45:session"));
} catch (IOException | InterruptedException | ExecutionException e) {
System.err.println("发生错误: " + e.getMessage());
Thread.currentThread().interrupt();
}
}
}

当您运行此 Java 代码时,输出将是:

Connection to Memcached server successful.
Set initial keys: 'config:feature_flags' and 'user:45:session'.
Value of 'config:feature_flags' before flush: {"new_dashboard": true}
Value of 'user:45:session' before flush: active
--- Flushing the cache ---
Cache flush command sent successfully.
Value of 'config:feature_flags' after flush: null
Value of 'user:45:session' after flush: null