前言

由于redis的keys命令是线上禁用,所以就有了SCANSSCANHSCANZSCAN四个命令。

但是这四个命令也不是每次返回全部匹配结果,因此需要一遍遍执行下去,而且每次返回的cursor要作为下一个的参数。

因此查找也不太方便,我写了一个简单的方法,用来查找scan的所有结果。关于这几个命令可以参考【详细解释

代码分享

package main

import (
"errors"
"flag"
"fmt"
"strings" "github.com/gomodule/redigo/redis"
) func main() {
addr := flag.String("addr", "redis://127.0.0.1:6379", "url")
cmd := flag.String("cmd", "SCAN", "SCAN or SSCAN or HSCAN or ZSCAN")
key := flag.String("key", "", "key")
match := flag.String("match", "", "MATCH pattern")
count := flag.Int("count", 10, "COUNT count")
max := flag.Int("max", 1000, "max count")
flag.Parse() err := scanHandle(*addr, *cmd, *key, *match, *count, *max)
if err != nil {
fmt.Println(err)
}
} func scanHandle(addr, cmd, key, match string, count, max int) error {
switch cmd = strings.ToUpper(cmd); cmd {
case "SCAN", "SSCAN", "HSCAN", "ZSCAN":
default:
return errors.New("cmd error")
} c, err := redis.DialURL(addr)
if err != nil {
return err
}
defer c.Close() var (
i = 0 // cursor下标位置
cursor = 0 // 默认从0开始
args = make([]interface{}, 0, 5)
) if cmd != "SCAN" {
if key == "" {
return errors.New(cmd + " must have key")
}
args = append(args, key)
i++
} args = append(args, cursor)
if match != "" {
args = append(args, "MATCH", match)
}
if count <= 0 {
count = 16
}
args = append(args, "COUNT", count) for {
args[i] = cursor
res, err := redis.Values(c.Do(cmd, args...))
if err != nil {
return err
} var tmp []string
_, err = redis.Scan(res, &cursor, &tmp)
if err != nil {
return err
} if lt := len(tmp); lt > 0 {
for _, v := range tmp {
// 打印结果
fmt.Println(v)
} if max -= lt; max <= 0 {
break
}
} if cursor == 0 {
break // 查询结束
}
}
return nil
}

总结

其实我们应该避免查找相关key,因为代码里面会保存相应的key,而且可以通过设置过期时间自动删除相关key。

不过redis提供了scan等方案,虽然可以达到效果,但是使用上是存在一点不方便的,总之应该尽量避免这些逻辑。

redis中使用SCAN代替KEYS的更多相关文章

  1. 在RedisTemplate中使用scan代替keys指令

    keys * 这个命令千万别在生产环境乱用.特别是数据庞大的情况下.因为Keys会引发Redis锁,并且增加Redis的CPU占用.很多公司的运维都是禁止了这个命令的 当需要扫描key,匹配出自己需要 ...

  2. Redis中的Scan命令踩坑记

    1 原本以为自己对redis命令还蛮熟悉的,各种数据模型各种基于redis的骚操作.但是最近在使用redis的scan的命令式却踩了一个坑,顿时发觉自己原来对redis的游标理解的很有限.所以记录下这 ...

  3. Redis中的Scan命令的使用

    Redis中有一个经典的问题,在巨大的数据量的情况下,做类似于查找符合某种规则的Key的信息,这里就有两种方式,一是keys命令,简单粗暴,由于Redis单线程这一特性,keys命令是以阻塞的方式执行 ...

  4. Redis 中的数据类型及基本操作

    Redis 内置的数据类型有 5种:字符串String.哈希Hash.列表List.集合Set.有序集合ZSet 字符串类型 String 是 Redis 中最基本的类型,一个 key 对应着一个 v ...

  5. redis中scan和keys的区别

    scan和keys的区别 redis的keys命令,通来在用来删除相关的key时使用,但这个命令有一个弊端,在redis拥有数百万及以上的keys的时候,会执行的比较慢,更为致命的是,这个命令会阻塞r ...

  6. redis 用scan 代替keys,hgetAll

    转载自:https://blog.csdn.net/w05980598/article/details/80264568 众所周知,当redis中key数量越大,keys 命令执行越慢,而且最重要的会 ...

  7. redis中keys命令带来的线上性能问题

    起因 下午接到运维反馈,生产redis有个执行keys的命令请求太慢了,要两三秒才能响应 涉及命令如下: KEYS ttl_600::findHeadFootData-15349232-*-head ...

  8. Redis解读(4):Redis中HyperLongLog、布隆过滤器、限流、Geo、及Scan等进阶应用

    Redis中的HyperLogLog 一般我们评估一个网站的访问量,有几个主要的参数: pv,Page View,网页的浏览量 uv,User View,访问的用户 一般来说,pv 或者 uv 的统计 ...

  9. 超大批量删除redis中无用key+配置

    目前线上一个单实例redis中无用的key太多,决定删除一部分. 1.删除指定用户的key,使用redis的pipeline 根据一定条件把需要删除的用户统计出来,放到一个表里面,表为 del_use ...

随机推荐

  1. Java | 字符串的使用 & 分析

    字符串 字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,在程序中所有的双引号字符串,都是String类的对象. 字符串的特点 1.字符串的内容永不可变. 2.正在是因为字符串的不 ...

  2. LVGL|lvgl中文手册(lvgl中文文档教程)

    lvgl官方的教程是英文的,这个是我在做项目时根据lvgl官方文档做出来的lvgl中文文档(持续更新维护),不仅仅只是生硬照搬lvgl官方文档的翻译,同时总结了我们在实际开发中遇到的各种细节,让这个文 ...

  3. create-react-app 入门学习

    全局安装 create-react-app npm install create-react-app -g 创建项目 在全局安装了create-react-app 后 创建项目,如果按照下面的第一种办 ...

  4. ESXi 切换直通导致无法识别硬盘解决

    在解决虚机挂载U盘的过程中(已经处理了:VMware中的虚机如何挂载U盘),怎么样都无法加载U盘,故进行了一次操作直通操作的过程中,不小心把所有的存储和控制器全部直通了,导致Esxi主机无法识别到自己 ...

  5. ffiddler抓取手机(app)https包

    很多同学有看过原文,但是按照原文还是没有设置成功(我就是其中一个)然后查了网上资料,在某些选项上进行增加,填写,配置通过.(和原文略有不同) 安装Fiddler,我们正常的流程在feiddler中设置 ...

  6. Mybatis order by 动态传参出现的一个小bug

    大家好,我是老三,一个平平无奇的CRUD仔. 今天,我正在愉快地CRUD,突然发现出现一个Bug,我们来看看是怎么回事吧! 问题由来 一个简单的需求,要求把和当前用户相关的数据置顶展示. 这里,我用了 ...

  7. Python基础之实现界面和代码分离

    第一步:用QT Designer画一个TreeWidget,存为treeview4.ui,这个处理前面TreeWidget那一节讲过,这里不细讲 treeview4.py # -*- coding: ...

  8. jvm源码解读--07 创建 fixup_mirrors

    通过前面的分析,创建的insttanceKlass 都没放入了java_lang_Class::fixup_mirror_list()这里类的数组里面了,所有的instance列举如下 ------- ...

  9. jquey 定位到有某个类

    $active = $('.g-pop-box .box-option a[class="on"]')

  10. Hadoop (8088)未授权访问

    cd /vulhub/hadoop/unauthorized-yarn 加速下载环境 sudo vim /etc/docker/daemon.json 添加 {"registry-mirro ...