欲买桂花同载酒,荒泷天下第一斗。|

janbar

园龄:4年6个月 粉丝:29 关注:10

2021-08-26 22:55 阅读 1141 评论 0 推荐

redis中使用SCAN代替KEYS

前言

由于redis的keys命令是线上禁用,所以就有了SCANSSCANHSCANZSCAN四个命令。
但是这四个命令也不是每次返回全部匹配结果,因此需要一遍遍执行下去,而且每次返回的cursor要作为下一个的参数。
因此查找也不太方便,我写了一个简单的方法,用来查找scan的所有结果。关于这几个命令可以参考【详细解释

代码分享

copy
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等方案,虽然可以达到效果,但是使用上是存在一点不方便的,总之应该尽量避免这些逻辑。

posted @   janbar  阅读(1141)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~

FAVOURITE

点击右上角即可分享
微信分享提示
*✧⁺˚⁺ପ(๑・ω・)੭ु⁾⁾ 好好学习天天向上
进入亮色模式
进入亮色模式

FAVOURITE