Redis 中使用 pipeline 执行命令时,有单次执行数量的限制吗?

2023-11-29 19:35:29 +08:00
 Ackvincent

通过 scan 方法获取 1W 个 key 的名字,然后使用 pipeline 执行 memory_usage 命令获取这 1W 个 key 占用空间的大小,这样会对服务器造成很大压力吗?现在在测试服务器上执行感觉没什么压力,不知道生产环境下,会不会有影响。 谢谢

2213 次点击
所在节点    Redis
9 条回复
kuituosi
2023-11-29 20:31:54 +08:00
redis 单线程的,一次执行 1w 个会导致处理其他请求延迟
ShuWei
2023-11-29 22:38:28 +08:00
我就是好奇的问一句,需要这样操作,这是什么样的场景啊
totoro52
2023-11-29 22:43:15 +08:00
其他线程会被阻塞
qianzanqi
2023-11-29 23:04:51 +08:00
服务端输出缓冲区被打爆了会强制断开连接,注意这个就好。而且 pipeline 一次一万和十次一千也差不了多少,多拆几次呗
lsk569937453
2023-11-30 08:54:08 +08:00
所以为什么不一条指令一条指令的执行 memory_usage 呢
Ackvincent
2023-11-30 10:40:29 +08:00
@kuituosi 谢谢您
@ShuWei 希望监控服务器的运行状态,提早发现 bigkey 以免内存不够用,看各位大佬的说法,这样做并不科学。
@totoro52 谢谢您
@qianzanqi 也有试过拆成十次一千,测试时执行时间是 4700ms ,一次一万是 1400ms ,之前考虑执行耗时短会减轻对服务器端的压。谢谢您。
@lsk569937453 这样每条指令都要通信一次,执行时间会比较长。
感谢各位大佬的帮助,后边调整为凌晨负载低的时间执行,尽量不对正常业务造成影响。
ShuWei
2023-11-30 11:38:12 +08:00
建议最好用行政手段从应用层规范,尽量避免大 key ,再使用 slowlog 定期检查是否有漏网之鱼,通过 scan 跟 memory usage 来检查,实在是个不太明智的做法

如果规模很大,可以考虑上个代理层,这样可以在代理层进行记录,可能更直观
shinyruo2020
2023-11-30 13:21:33 +08:00
用管道问题不大,注意不要用事务就行
guxingke
2023-11-30 13:43:14 +08:00
https://github.com/guxingke/redis-tools

------
贴一个小工具,bigkeys ,扫描 rdb 的大 key

λ rdt bigkeys xxxx.rdb
total: 4419415

Biggest String Keys
┌───────────────────┬───────────────────┬───────────────────┬───────────────────┬──────────────────┐
│ key │ type │ mem(byte) │ size │ ttl(ms) │
├───────────────────┼───────────────────┼───────────────────┼───────────────────┼──────────────────┤
│ xxxxxxx │ String │ 222955086 │ 1 │ -1 │
│ yyyyyyyyyyyyt │ String │ 13 │ 1 │ 110394014 │

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/996334

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX