清除 Redis 缓存的方式分为全量清除和精准清除,需根据业务场景选择(生产环境慎用全量清除),以下是详细方法:
一、通过 Redis 命令行(redis-cli)操作
1. 全量清除所有缓存(慎用!清空整个 Redis)
适用于测试环境、缓存全量失效等场景,分两种清空策略:
bash
运行
# 方式1:异步清空(非阻塞,速度快,推荐)
redis-cli FLUSHALL ASYNC
# 方式2:同步清空(阻塞直到完成,不推荐生产)
redis-cli FLUSHALL
# 方式3:清空当前选中的数据库(默认db0)
redis-cli FLUSHDB ASYNC # 异步
redis-cli FLUSHDB # 同步
- 区别:
FLUSHALL清空所有数据库,FLUSHDB仅清空当前数据库;ASYNC异步删除(Redis 4.0+ 支持),不阻塞主线程。
2. 精准清除指定缓存(推荐生产环境)
按 key 精准删除,避免影响其他缓存:
bash
运行
# 删除单个key
redis-cli DEL key1
# 删除多个key
redis-cli DEL key1 key2 key3
# 删除匹配规则的key(批量删除,需注意性能)
# 方式1:通过redis-cli结合通配符(适用于少量key)
redis-cli KEYS "user:*" | xargs redis-cli DEL
# 方式2:使用SCAN替代KEYS(避免阻塞,适用于大量key)
redis-cli --scan --pattern "order:*" | xargs redis-cli DEL
- 注意:
KEYS命令在数据量大时会阻塞 Redis,生产环境优先用SCAN遍历删除。
3. 清除过期缓存(Redis 自动清理,也可手动触发)
Redis 会异步清理过期 key,也可手动触发主动清理:
bash
运行
# 主动触发过期key清理(非阻塞)
redis-cli EXPIRE key1 0 # 手动设置key1过期(立即失效)
redis-cli MEMORY PURGE # 释放过期key占用的内存(Redis 4.0+)
二、通过编程语言 SDK 操作
以 Python(redis-py)和 Java(Jedis)为例:
1. Python 示例
python
运行
import redis
# 连接Redis
r = redis.Redis(host='localhost', port=6379, password='your_pwd', db=0)
# 1. 删除单个key
r.delete('key1')
# 2. 删除多个key
r.delete('key1', 'key2', 'key3')
# 3. 批量删除匹配规则的key(SCAN遍历)
for key in r.scan_iter(match='user:*', count=1000):
r.delete(key)
# 4. 清空所有缓存(慎用)
r.flushall(asynchronous=True) # 异步清空
# r.flushdb(asynchronous=True) # 清空当前db
2. Java(Jedis)示例
java
运行
import redis.clients.jedis.Jedis;
import java.util.Iterator;
import java.util.Set;
public class RedisClearCache {
public static void main(String[] args) {
// 连接Redis
Jedis jedis = new Jedis("localhost", 6379);
jedis.auth("your_pwd");
// 1. 删除单个key
jedis.del("key1");
// 2. 删除多个key
jedis.del("key1", "key2", "key3");
// 3. 批量删除匹配规则的key(SCAN遍历)
ScanParams params = new ScanParams().match("order:*").count(1000);
String cursor = "0";
do {
ScanResult<String> result = jedis.scan(cursor, params);
Set<String> keys = result.getResult();
if (!keys.isEmpty()) {
jedis.del(keys.toArray(new String[0]));
}
cursor = result.getStringCursor();
} while (!cursor.equals("0"));
// 4. 清空所有缓存(慎用)
jedis.flushAllAsync(); // 异步清空
// jedis.flushDBAsync(); // 清空当前db
jedis.close();
}
}
三、生产环境注意事项
- 禁止无脑 FLUSHALL:全量清空会导致缓存雪崩,业务直接查数据库,可能压垮 DB。
- 批量删除用 SCAN:
KEYS *会遍历所有 key,阻塞 Redis 主线程,生产环境必须用SCAN分批遍历。 - 设置过期时间兜底:即使忘记手动删除,通过
EXPIRE key seconds设置过期时间,避免缓存永久无效。 - 集群环境处理:
- 备份与回滚:操作前可通过
BGSAVE备份 RDB 文件,若误删可恢复。
四、常见问题排查
- 执行
DEL key返回 0:key 不存在,检查 key 名称 / 数据库(默认 db0,是否连错 db)。 - 批量删除无效果:通配符规则错误(如
user*而非user:*),或 Redis 版本不支持SCAN(需 Redis 2.8+)。

