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)
如果数据量大,FLUSHDB
或 FLUSHALL
可能阻塞主线程。从 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
是核武器,上线前务必确认环境,别把生产缓存干掉了。