1. 概述

在使用 Redis 做缓存时,缓存失效后全量清空是一个常见需求。比如服务升级、数据迁移或缓存污染场景下,直接清空比逐个失效更简单粗暴有效。

本文将介绍如何清空 Redis 中的所有数据,涵盖:

  • 单个数据库(database)的清空
  • 所有数据库的全局清空
  • 命令行与 Java 客户端(Jedis)两种操作方式

✅ 适合有 Redis 使用经验的开发者快速查阅
⚠️ 生产环境慎用,避免误删


2. 启动 Redis 环境

要测试删除操作,先得有个 Redis 实例。推荐用 Docker 快速启动,省去本地安装的麻烦。

启动 Redis 容器

docker run --name redis -p 6379:6379 -d redis:latest

连接并测试

使用 redis-cli 进入交互模式:

docker exec -it redis redis-cli

执行 ping 验证服务是否正常:

127.0.0.1:6379> ping
PONG

退出用 CTRL+C 就行。

💡 提示:开发测试用嵌入式 Redis 更方便,下文会用到。


3. Redis 删除命令

Redis 提供两个核心命令用于清空数据:

命令 作用范围 是否影响其他库
FLUSHDB 清空当前选中的数据库 ❌ 不影响其他 database
FLUSHALL 清空所有数据库(全部 16 个) ✅ 全部清空

异步清空(ASYNC)

如果数据量大,FLUSHDBFLUSHALL 可能阻塞主线程。从 Redis 4.0.0 开始,支持异步执行:

FLUSHDB ASYNC
FLUSHALL ASYNC

✅ 推荐生产环境使用 ASYNC,避免长时间阻塞
❌ 同步模式下,Redis 会卡住直到删除完成


4. 使用 Java 客户端(Jedis)

Java 项目中常用 Jedis 作为 Redis 客户端。下面演示如何通过代码执行清空操作。

4.1 依赖引入

Maven 添加以下依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>5.0.2</version>
</dependency>

测试时推荐使用嵌入式 Redis,避免依赖外部环境:

<dependency>
    <groupId>com.github.kstyrc</groupId>
    <artifactId>embedded-redis</artifactId>
    <version>0.6</version>
    <scope>test</scope>
</dependency>

4.2 启动嵌入式 Redis

测试时用嵌入式服务更稳定,代码如下:

int port = 6380; // 避免与本地 Redis 冲突
RedisServer redisServer = new RedisServer(port);
redisServer.start();

Jedis jedis = new Jedis("localhost", port);

📌 注意:嵌入式 Redis 仅用于单元测试,不要用于生产!


5. 清空单个数据库

先存点数据验证写入:

String key = "user:1001";
String value = "tom";
jedis.set(key, value);
String received = jedis.get(key);

assertEquals(value, received);

执行清空:

jedis.flushDB(); // 清空当前库

验证是否删除成功:

assertNull(jedis.get(key)); // 返回 null,说明已删除

flushDB() 只影响当前 SELECT 的数据库
⚠️ 如果没显式 select,默认操作 db0


6. 清空所有数据库

Redis 默认支持 16 个数据库(db0 ~ db15),可以用 SELECT 切换。

存入多库数据

jedis.select(0);
jedis.set("user:name", "Alice");

jedis.select(1);
jedis.set("order:id", "O1001");

验证数据分布:

jedis.select(0);
assertEquals("Alice", jedis.get("user:name"));
assertNull(jedis.get("order:id")); // db1 的数据拿不到

jedis.select(1);
assertEquals("O1001", jedis.get("order:id"));
assertNull(jedis.get("user:name")); // db0 的数据拿不到

执行全局清空

jedis.flushAll(); // 清空所有数据库

验证结果:

jedis.select(0);
assertNull(jedis.get("user:name"));

jedis.select(1);
assertNull(jedis.get("order:id"));

flushAll() 是真正的“全删”,不管当前在哪个库
flushDB() 只删当前库,容易踩坑


7. 时间复杂度分析

虽然 Redis 性能很强,但清空操作不是 O(1) 的。

操作 时间复杂度 说明
FLUSHDB O(N) N 为当前数据库的 key 数量
FLUSHALL O(N) N 为所有数据库的 key 总数

⚠️ 数据量大时,即使异步执行也可能导致短暂性能抖动
✅ 建议在低峰期执行,或拆分成批量删除


8. 总结

本文覆盖了 Redis 全量删除的核心知识点:

  • FLUSHDB:清空当前库,适合隔离场景
  • FLUSHALL:清空所有库,慎用!
  • ASYNC 模式避免阻塞,生产推荐
  • ✅ Jedis 提供 flushDB()flushAll() 方法,语义清晰
  • ✅ 测试可用嵌入式 Redis + Jedis 快速验证

📁 示例代码已托管至 GitHub:https://github.com/example/redis-flush-demo

📌 最后提醒:FLUSHALL 是核武器,上线前务必确认环境,别把生产缓存干掉了。


原始标题:Delete Everything in Redis