当前位置:首页 > 问答 > 正文

Redis里要是想一把清空所有键值,有没有啥快捷方法啊,别一个个删太麻烦了

(来源:Redis官方命令文档)

你可以把Redis想象成一个巨大的仓库,里面有很多个库房(在Redis里叫做“数据库”,默认有16个,编号从0到15)。FLUSHALL 这个命令的作用,就是不管你现在身处哪个库房,它都会冲进所有的库房,把里面所有的键值对、列表、集合等等所有数据,一次性全部清空,最后给你留下一个个空空如也的房间,这个操作是非常霸道和彻底的,所以一定要在确认无误的情况下使用,因为一旦执行,数据基本就找不回来了。

具体怎么用呢?非常简单,你需要连接到你的Redis服务器,比如使用 redis-cli 这个命令行工具,连接上去之后,直接在提示符后面输入 FLUSHALL,然后按回车键就可以了,Redis会返回一个 OK 的响应,这就表示所有数据已经被成功清除了。

0.0.1:6379> FLUSHALL
OK

看到这个“OK”,就意味着你的Redis已经“一贫如洗”了。

(来源:Redis官方命令文档关于FLUSHALL模式的说明)

这里有一个非常重要的细节需要你知道,在现代版本的Redis(4.0及以上)中,FLUSHALL 命令实际上有两种执行模式,这个设计主要是为了应对不同场景下的性能需求,避免清空大量数据时导致服务卡顿。

第一种模式是默认的同步模式,你直接输入 FLUSHALL,它就是同步执行的,这意味着Redis服务器会停下手里所有其他的活,专心致志地去删除所有数据,如果你的数据库里数据量特别特别大,有数百万甚至更多个键,那么这个过程可能会花费一些时间,在这段时间里,Redis服务器可能无法及时响应其他客户端的命令,感觉上就是服务器“卡”了一下。

第二种模式是异步模式,这是为了解决上述“卡顿”问题而引入的,你需要输入的命令是 FLUSHALL ASYNC,当你加上 ASYNC 这个参数后,Redis服务器就不会亲自去干删除数据这个重活了,它会把这个清理任务交给一个后台线程去慢慢处理,而自己立刻返回一个“OK”给你,然后马上就能去处理其他客户端的请求了,这样就不会阻塞服务,体验更好,数据最终也是会被删掉的,只是删除的动作在后台默默进行。

那么该怎么选呢?如果你是在生产环境(就是正在对外提供服务的正式环境),而且数据量很大,担心影响线上业务,那么使用 FLUSHALL ASYNC 是更稳妥的选择,如果你只是在本地开发环境或者测试环境,数据量不大,或者就是需要立刻清空然后进行下一步操作,那么直接用默认的 FLUSHALL 也没问题。

(来源:Redis官方命令文档关于FLUSHDB命令的说明)

除了清空所有库房的 FLUSHALL,Redis还提供了一个“局部清理”的命令,叫做 FLUSHDB,这个命令的名字就差一个字母,但作用范围小很多。FLUSHDB 只会清空你当前所在的那一个数据库,而完全不会动其他15个数据库里的数据。

举个例子,你通过 redis-cli 连接后,默认是在0号数据库,如果你输入 FLUSHDB,那么只有0号数据库被清空,1到15号数据库里的数据都安然无恙,这个命令同样支持 ASYNC 参数,也就是 FLUSHDB ASYNC,作用和上面说的类似,也是异步执行,避免阻塞。

当你需要清理数据时,先想清楚:我是要所有数据都不要了呢(FLUSHALL)?还是只想清理当前这个库,别的库的数据还得留着(FLUSHDB)?想清楚了再下手。

极其重要的警告和提醒

无论你用哪个命令,都必须像对待厨房里的锋利刀具一样,万分小心,因为这两个命令都是不可逆的,一旦执行成功,数据就没了,尤其是在你连接到生产环境的Redis服务器时,一定要反复确认自己是不是在正确的环境上,有太多惨痛的教训都是因为开发人员不小心在正式环境执行了清空命令,导致线上业务数据丢失,造成巨大的损失。

养成一个好习惯:

  1. 在执行 FLUSHALLFLUSHDB 前,先用 SELECT 命令(SELECT 1)看看是不是你打算清空的那个数据库,或者用 INFO keyspace 命令看一眼各个数据库的大致键数量,做个最后的确认。
  2. 如果条件允许,最好在清空之前做好数据备份,虽然清空操作通常是为了快速重置环境,但多一份保险总没错。
  3. 对于生产环境,可以考虑通过Redis的配置文件(redis.conf)来禁用这两个危险的命令,从根本上避免误操作,可以在配置文件中加上 rename-command FLUSHALL ""rename-command FLUSHDB "",这样即使有人输入这些命令,Redis也会当作未知命令来处理,从而起到保护作用。

Redis一键清空所有键值的快捷方法就是:

  • 清空所有数据库:使用 FLUSHALL(同步)或 FLUSHALL ASYNC(异步)。
  • 清空当前数据库:使用 FLUSHDB(同步)或 FLUSHDB ASYNC(异步)。

权力越大,责任越大,这几个命令用起来非常爽快,但务必在确认安全的场合下使用。

Redis里要是想一把清空所有键值,有没有啥快捷方法啊,别一个个删太麻烦了