服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Redis - redis模糊批量删除key的方法

redis模糊批量删除key的方法

2022-12-19 19:50杰哥的技术杂货铺 Redis

这篇文章主要介绍了redis模糊批量清除key的操作方法,包括命令行删除和golang代码删除,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、命令行删除

?
1
redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 KEYS "websocket127.0.0.1:5*" | xargs redis-cli -h 172.18.255.99 -p 6379 -n 6 -a 123456 DEL
  • -h:redis地址
  • -p:redis端口
  • -n:reids库
  • -a:redis密码

Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。

注:这个指令使用非常简单,提供一个简单的正则字符串即可,但是有很明显的两个缺点。

  • 没有 offset、limit 参数,一次性吐出所有满足条件的 key,万一实例中有几百 w 个 key 满足条件,
  • 当你看到满屏的字符串刷的没有尽头时,你就知道难受了。
  • keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿,
  • 所有读写 Redis 的其它的指令都会被延后甚至会超时报错,
  • 因为 Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续。

所以建议生产环境屏蔽keys命令

scan 相比 keys 具备有以下特点:

  • 复杂度虽然也是 O(n),但是它是通过游标分步进行的,不会阻塞线程;
  • 提供 limit 参数,可以控制每次返回结果的最大条数,limit 只是对增量式迭代命令的一种提示(hint),返回的结果可多可少;
  • 同 keys 一样,它也提供模式匹配功能;
  • 服务器不需要为游标保存状态,游标的唯一状态就是 scan 返回给客户端的游标整数;
  • 返回的结果可能会有重复,需要客户端去重复,这点非常重要;
  • 遍历的过程中如果有数据修改,改动后的数据能不能遍历到是不确定的;
  • 单次返回的结果是空的并不意味着遍历结束,而要看返回的游标值是否为零

KEYS vs SCAN

一樣都會掃過所有的 key,scan 不會阻塞整個 server,而是迭代的收集結果

DEL vs UNLINK

一樣都是刪除 key ,差別在於 unlink 是非阻塞的刪除,會以非同步的方式回收記憶體

所以对于一个大的key数量,我们可以借助sscan使用下边的命令可以实现优雅的批量删除:

?
1
redis-cli -h 172.18.255.99 -p 6379 --scan --pattern users:* | xargs redis-cli -h 172.18.255.99 -p 6379 unlink
  • 用 scan 找出要刪的 key
  • 透過 xargs 傳給 unlink 刪掉 key
?
1
(error) ERR unknown command 'unlink'

如果出现以上错误,说明redis版本不足,使用unlink需要Redis4版本

cluster 删除数据

?
1
redis-cli -c -p 7000 --scan --pattern "age_*" | xargs -L 1 redis-cli -c -p 7000 -n 0 unlink

遍历redis cluster各分片删除

?
1
2
3
for port in {7000..7005}; do
    redis-cli -c -p ${port} -h 192.168.31.181 --scan --pattern "age_*" | xargs -L 1 redis-cli -h 192.168.31.181 -c -p ${port} -n 0 unlink 
done

二、golang代码删除

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
func DeleteRedisKeys(key string) {
    traceId := libra.GenTraceId(context.Background(), nil)
    ctx := libra.SetTraceId(context.Background(), traceId)
    //模糊查询所有符合条件的key
    websocketKeys, _ := commons.GetRedisClient().Keys(ctx, key+"*").Result()
    if reflect.TypeOf(websocketKeys).Kind() == reflect.Slice {
        val := reflect.ValueOf(websocketKeys)
        if val.Len() == 0 {
            return
        }
        // 批量删除key
        for i := 0; i < val.Len(); i++ {
            _, err := commons.GetRedisClient().Del(ctx, val.Index(i).Interface().(string)).Result()
            dlog.Errorf("DeleteKeys addr:=%v,err=%v", addr, err)
        }
    }
}

参考文档

Redis SCAN的使用:http://jinguoxing.github.io/redis/2018/09/04/redis-scan/

到此这篇关于redis模糊批量清除key的文章就介绍到这了,更多相关redis模糊删除key内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/cljdsc/article/details/128333143

延伸 · 阅读

精彩推荐
  • Redis还不懂Redis?看完这个趣味小故事就明白了!

    还不懂Redis?看完这个趣味小故事就明白了!

    这篇文章主要用趣味性的方法讲解了redis是什么?并且和MYSQL的区别是什么,有对redis不太懂的小伙伴可以来看一下吧...

    轩辕之风11612021-02-21
  • Redis浅谈Redis中的自动过期机制

    浅谈Redis中的自动过期机制

    本文主要介绍了浅谈Redis中的自动过期机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着...

    超级码里喵10852022-10-18
  • RedisLinux中设置Redis开机启动的方法

    Linux中设置Redis开机启动的方法

    这篇文章主要给大家介绍了关于Linux中设置Redis开机启动的方法,主要包括在CentOS7.0系统和Debian 8.0系统下实现方法,文中介绍的非常详细,需要的朋友可以...

    YoYong6912019-11-05
  • Redisredis分布式锁优化的实现

    redis分布式锁优化的实现

    本文主要介绍了redis分布式锁优化的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    我的头疼11662021-11-17
  • RedisRedis,就是这么朴实无华

    Redis,就是这么朴实无华

    Redis是2009年发布的,到今天已经超过10岁了。作为必备技能之一,关于它也有聊不完的话题。本文中的任何一个点,都可以展开,完成一篇中等规模的文章...

    小姐姐味道3472020-11-30
  • Redisredis 主从备份及其主备切换的操作

    redis 主从备份及其主备切换的操作

    这篇文章主要介绍了redis 主从备份及其主备切换的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    刘迎光-萤火虫工作室9252021-07-31
  • RedisRedis入门基础常用操作命令整理

    Redis入门基础常用操作命令整理

    这篇文章主要为大家介绍了Redis入门基础常用操作命令的整理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    把苹果咬哭的测试笔记6582022-10-20
  • RedisRedis+Caffeine实现分布式二级缓存组件实战教程

    Redis+Caffeine实现分布式二级缓存组件实战教程

    这篇文章主要介绍了Redis+Caffeine实现分布式二级缓存组件实战教程,介绍了分布式二级缓存的优势,使用组件的方法,通过示例代码给大家介绍的非常详细,...

    上帝爱吃苹果-6552022-08-07