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

教你快速一键搞定Redis里想删的那个Key,省时又方便

日常运维经验和Redis官方文档

想快速删掉Redis里某个key,不用折腾,直接看这儿,有时候你看着Redis里一堆数据,就想精准干掉某一个,比如那个叫“user:1000:cache”的破key,或者一堆名字像“temp_session:xxx”的临时玩意儿,最直接、最傻瓜的方法就是用DEL命令,但如果你要删的key很多,或者名字没规律,一个个敲DEL就得累死,下面这几种法子,保你省时省力,看情况选就行。

第一招:直接用DEL命令,适合单个或少量的key

这是最基础的,打开你的Redis客户端(比如用redis-cli),然后输入:

DEL your_key_name

要删掉“my_temp_data”,就输DEL my_temp_data,这命令立马就办,key没了就是没了,但记住,要是key不存在,它也不报错,只是返回0告诉你没删成啥,这招好处是直来直去,缺点是你得知道key的全名,而且只能一个一个来,要是你有十个八个key要删,手指头都得敲酸。

第二招:用通配符批量删,key名字有规律时特好用

这是重点!Redis自己没直接提供通配符删除命令,但我们可以用KEYS命令先找出所有匹配的key,然后再用DEL一起删掉,注意啊,KEYS命令在数据量大的时候可能会卡住Redis,因为它会遍历所有key,所以最好别在生产环境高峰时段用,但平时自己测试或者数据不多时,这招快得要命。

具体操作是分两步:

教你快速一键搞定Redis里想删的那个Key,省时又方便

  1. 先用KEYS加通配符找出你想删的那些key,通配符和文件名差不多,代表任意字符,代表一个字符,想找所有以“temp:”开头的key,就输:

    KEYS temp:*

    屏幕上会列出所有匹配的key,你先瞅一眼,别删错了。

  2. 确认无误后,把KEYS的结果传给DEL,在redis-cli里,可以这么一条命令搞定:

    redis-cli KEYS "temp:*" | xargs redis-cli DEL

    这行命令的意思是:先执行KEYS "temp:*"找出所有key,然后通过管道传给xargsxargs会把每个key的名字作为参数塞给后面的DEL命令,相当于自动帮你执行了一串DEL key1 DEL key2 ...

    如果你用的客户端支持执行Lua脚本(比如一些图形化工具),也可以直接跑个简单脚本:

    EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 temp:*

    这个脚本效果一样,但更高效点,因为只在服务端跑一次。

    教你快速一键搞定Redis里想删的那个Key,省时又方便

第三招:用SCAN代替KEYS,安全第一

刚才说了KEYS可能阻塞服务,如果Redis里key贼多,你又怕出问题,就用SCAN命令。SCAN是渐进式遍历,不会一下子卡死Redis,不过用起来稍微麻烦点,得循环操作。

在命令行里,你可以写个简单循环(Linux或Mac的shell下):

redis-cli --scan --pattern "temp:*" | xargs -L 1000 redis-cli DEL

这里--scan --pattern就是代替KEYS,用游标分批找key,然后xargs -L 1000表示每1000个key一组来删,避免一次删太多,这法子适合生产环境,稳当。

第四招:靠编程搞定,灵活性强

如果你本来就是写代码操作Redis的,那在程序里批量删更简单,比如用Python的redis库:

教你快速一键搞定Redis里想删的那个Key,省时又方便

import redis
r = redis.Redis(host='localhost', port=6379)
keys = r.keys("temp:*")  # 找到所有匹配的key
if keys:
    r.delete(*keys)       # 一次性删除

或者用Node.js:

const redis = require("redis");
const client = redis.createClient();
async function deleteKeys() {
    const keys = await client.keys("temp:*");
    if (keys.length > 0) {
        await client.del(keys);
    }
}
deleteKeys();

编程的好处是能结合业务逻辑,比如你可以先判断key是否存在、记录日志啥的,再删。

重要提醒:删key前务必确认!

不管用哪招,手别抖!删数据不是闹着玩的,尤其是生产环境,建议先:

  • KEYSSCAN预览一下要删的key列表,double-check。
  • 如果可能,备份一下数据(比如用BGSAVE生成RDB文件)。
  • 考虑给key设置过期时间(用EXPIRE),让它们自动失效,比手动删更省心。

特殊情况:想清空整个数据库?

如果你是想彻底清空当前数据库(所有key都没了),那更简单:

  • FLUSHDB:只清空当前选的这个数据库。
  • FLUSHALL:清空Redis服务器上所有数据库。 这俩命令威力巨大,千万别乱用!一般只有测试环境或者确定要重置数据时才碰。

快速删key就这几种路子:单个删用DEL,批量删用KEYSSCAN加管道,写代码就用对应库的删除方法,核心就是利用通配符匹配一批key,然后一次性送走,平时操作多留个心眼,别误删重要数据就行。