通过 scan 方法获取 1W 个 key 的名字,然后使用 pipeline 执行 memory_usage 命令获取这 1W 个 key 占用空间的大小,这样会对服务器造成很大压力吗?现在在测试服务器上执行感觉没什么压力,不知道生产环境下,会不会有影响。 谢谢
1
kuituosi 352 天前
redis 单线程的,一次执行 1w 个会导致处理其他请求延迟
|
2
ShuWei 351 天前
我就是好奇的问一句,需要这样操作,这是什么样的场景啊
|
3
totoro52 351 天前
其他线程会被阻塞
|
4
qianzanqi 351 天前
服务端输出缓冲区被打爆了会强制断开连接,注意这个就好。而且 pipeline 一次一万和十次一千也差不了多少,多拆几次呗
|
5
lsk569937453 351 天前
所以为什么不一条指令一条指令的执行 memory_usage 呢
|
6
Ackvincent OP @kuituosi 谢谢您
@ShuWei 希望监控服务器的运行状态,提早发现 bigkey 以免内存不够用,看各位大佬的说法,这样做并不科学。 @totoro52 谢谢您 @qianzanqi 也有试过拆成十次一千,测试时执行时间是 4700ms ,一次一万是 1400ms ,之前考虑执行耗时短会减轻对服务器端的压。谢谢您。 @lsk569937453 这样每条指令都要通信一次,执行时间会比较长。 感谢各位大佬的帮助,后边调整为凌晨负载低的时间执行,尽量不对正常业务造成影响。 |
7
ShuWei 351 天前
建议最好用行政手段从应用层规范,尽量避免大 key ,再使用 slowlog 定期检查是否有漏网之鱼,通过 scan 跟 memory usage 来检查,实在是个不太明智的做法
如果规模很大,可以考虑上个代理层,这样可以在代理层进行记录,可能更直观 |
8
shinyruo2020 351 天前
用管道问题不大,注意不要用事务就行
|
9
guxingke 351 天前
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 │ |