前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?

假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如何将它们全部找出来?

作者头像
LinkinStar
发布2024-04-13 09:25:57
1340
发布2024-04-13 09:25:57
举报
文章被收录于专栏:LinkinStar's BlogLinkinStar's Blog

这个问题本身不难,但网上的教程答案让我很不理解,所以单独拿来吐槽一下

来源与网络的答案

redis-scan-command-benchmark
redis-scan-command-benchmark

我特意用了截图而不是贴链接。其中“如何”还打成了如果…

有什么问题?

如果我是面试官,问了这个问题,如果你第一回答是 keys,那么恭喜你可以回去等通知了(言重了,说白了就不往下问了)

1 亿个,你知道什么概念吗?如果直接 keys 一下线上的数据不知道要阻塞多久,你下面的回答明明就知道答案偏偏把人家往沟里带…

但如果就只是如此,我也不用写这篇博客了,我想说的是 SCAN 也不是最优解

SCAN 有什么问题

不卡,但是慢,下面是来源与网络的一个测试结果,Redis 性能问题诊断以及 scan 命令耗时分析

代码语言:javascript
复制
测试命令:
./redis-benchmark -a xxxx  -r 10000 -n 100 -c 8000 scan 0 match zhaobsh* count  10000
10000个随机key, 测试100次, 使用 80000个client进行测试验证.
被测试的命令为: scan 0 match zhaobsh* count  10000

一万个key时count 一万时:
Summary:
  throughput summary: 99.11 requests per second
  latency summary (msec):
          avg       min       p50       p95       p99       max
      993.304    17.472  1004.543  1005.055  1005.055  1005.055

十万个key时 count 十万时
Summary:
  throughput summary: 11.54 requests per second
  latency summary (msec):
          avg       min       p50       p95       p99       max
     2970.660   135.680  3000.319  3000.319  3000.319  3000.319
五十万个key时 count 五十万时
Summary:
  throughput summary: 3.46 requests per second
  latency summary (msec):
          avg       min       p50       p95       p99       max
     2972.532   322.816  3000.319  3000.319  3000.319  3000.319

自己进行了一下验证, 如果直接一次scan 一千万的记录
耗时为: 10.15秒.
理论上scan 一个键值对的时间为 1微秒左右.

如果redis里面有 1000万个key的话  60台服务器如果同时进行一次所有的scan
那么搞不好至少会有在 运行期间内产生总计 600S 的延迟时间.

显然,多少还是会给线上系统有影响的,可以有个毛刺?具体就看实际情况了。

那么我们来分析一下问题,如果面试官只是要考查你 KEYS 命令和 SCAN 命令的区别,并且想要看看你知不知道 KEYS 命令的阻塞问题,那么你回答 SCAN 就已经过了。

而实际中,如果真的有经验,你就会发现 SCAN 的能力阈值是在那里的。于是你需要继续反问面试官,是否有时间要求。

实际业务

在实际业务中,我能想到的场景有两个:

  1. 明知山有虎:就是你本身就有这样的业务场景需要去做所有当前 key 的统一操作,那么以空间换时间,提前以其他数据结构存储你需要的 key 才合理。比如,现在想要让 user 的 key 全部过期,至少我不会去考虑使用 scan 遍历出来然后再进行处理。
  2. 意外的统计:我现在突然有一个统计的需求,但统计的数据只有缓存里面有。那么没办法,甲方最大,SCAN 就 SCAN 吧。但要注意 SCAN 重复性的问题。

总结

我其实想说的是,作为线上的数据和操作,你的每次操作都需要明确可能会带来的后果是什么,并不是简单的别人说 SCAN 就 SCAN 了,你需要清楚的了解可能的后果,你才有底气去操作。同时也会让问你的人清楚,你是有过经验的人,而非纸上谈兵。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 来源与网络的答案
    • 有什么问题?
    • SCAN 有什么问题
      • 实际业务
      • 总结
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档