HMGET 查询 2W 个字段会有问题吗

2023-12-21 12:44:26 +08:00
 unt

一个 hash 表里大约有 20W 个字段,每个字段 2kb 。

使用 HMGET 一次获取 2W 个字段会有问题吗,如果优化。

HMGET 的性能瓶颈大约是达到多少量级

1417 次点击
所在节点    程序员
8 条回复
sinksmell
2023-12-21 13:31:18 +08:00
有问题,命令执行太慢了会阻塞后面的请求,网络带宽占用也高。优化,可以改成 pipeline 。
zdt3476
2023-12-21 13:44:24 +08:00
有没有性能瓶颈取决于你这个接口的请求频率了,具体问题楼上也说了。话说什么行为会一次性要用到两万的字段。
unt
2023-12-21 13:48:27 +08:00
@zdt3476 #2 iot 状态数据
Lax
2023-12-21 13:56:24 +08:00
好奇 20 万个字段的 key 都是啥
unt
2023-12-21 14:10:10 +08:00
@sinksmell #1 HMGET 的时间复杂度 On ,这个 n 是要查询的字段数量吗,和数据库大小有关系吗。换言之,从 20W 条数据的表里 HMGET 1 个字段 和 从 1W 条数据的表里 HMGET 1 个字段, 时间上有差别吗
unt
2023-12-21 14:12:52 +08:00
@zdt3476 #2 嗯,试过了,redis 排队执行命令, 那单次接口查得快确实不能说明什么
jyao
2023-12-21 17:04:00 +08:00
BigKey 通常以 Key 的大小和 Key 中成员的数量来综合判定,例如:

Key 本身的数据量过大:一个 String 类型的 Key ,它的值为 5 MB
Key 中的成员数过多:一个 ZSET 类型的 Key ,它的成员数量为 10,000 个
Key 中成员的数据量过大:一个 Hash 类型的 Key ,它的成员数量虽然只有 1,000 个但这些成员的 Value (值)总大小为 100 MB

推荐值:
单个 key 的 value 小于 10KB
对于集合类型的 key ,建议元素数量小于 1000

个人推荐你可以把 key 拆分一下, 拆成多个 key, 这样避免对元素较多的 hash 、list 、zset 等做运算会耗时较旧,使主线程被阻塞, 这样可能会导致一条命令干死一个实例
cnleon
2023-12-21 19:35:21 +08:00
比较好奇为啥要一次取那么多?

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

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

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

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

© 2021 V2EX