我使用redis将一些json值存储在唯一的字符串键中。由于一些要求,我必须在1中获取多个键值对(精确地为15 K),我使用C ++和cpp_redis使用了MGET redis命令。
系统工作正常,但时间有问题。 MGET很慢,我在c ++中观察到大约200+ ms的延迟,并且它也在SLOWLOG中显示。
127.0.0.1:6379> SLOWLOG GET
1) 1) (integer) 893
2) (integer) 1518509153
3) (integer) 167090
4) 1) "MGET"
2) "2be1d3559aa1c93b7b84b144c82c048d"
3) "ac37b25293276382a1eb9fb634bd1ece"
4) "b7257ed986e23dc3bfc630ace592be7c"
5) "e6f92ac1c8c7734d22473d9648863b88"
6) "98b3077022d5a32fbb3df4434ac6a3ed"
7) "00de037007eef73d97e648daa06e5ffb"
8) "60e7fb8be50c543012243cb204cb8694"
9) "6a99e16b15ba6a65801a777cbb19bc3e"
10) "68e1c22474db63f925f2c1fe14f5d2d6"
11) "b12e2cbb1330b1b73d6a0108e5f82062"
12) "cc29fe2f71770848dfc1b8bec955523c"
13) "6e3d9bf3be3b70b38058f0e345a330dd"
14) "a6642a96fae7ccd4fe368dc58bc04bee"
15) "54e04e4d08b69fee6f73adf56d5548ec"
16) "64412a5def4407fe71ba0864898c1c10"
17) "3f2435bfbd23d264b2e2bef22e68b014"
18) "4c70944023f9e6fb6e55fffb9c1f0156"
19) "9dfdb0f0ea8151016f335eaefb5c38a4"
20) "1f9b8a6e35e985e335b5eb223ce170d3"
21) "6e40a2d1e7016a19ea04711f38de793e"
22) "ec8228f23fe0c05caef99dc43c0ec699"
23) "20c1e4239912b7aa6fb4930ee36e49f4"
24) "5d64ed638091eb658d16f5f1cd8575ae"
25) "4176452c864d229b7c4190cea8187717"
26) "b4ece113856f220dc15bfd4b8ed605e8"
27) "e015e9f10e14f31cb5a09525f86d57b1"
28) "360507bac0e7e8bd0d73ed7edf777663"
29) "18b7d6ca197a01c5773d3cbe204fef8d"
30) "0f3d1d8db2c712f11644240a10e885e0"
31) "b9d91378fff3a19544c482233df1268f"
32) "... (14970 more arguments)"
是否有任何最佳做法或特殊事项可以快速拨打电话。
答案 0 :(得分:1)
MGET取决于两个因素:
您获取的密钥数。每次提取都是O(1)所以N取的当然是O(N)。 1000个键比100个键慢〜10倍。没办法
每个对象的大小 - 对象越大,序列化响应所需的时间就越多。
一个MGET的15K对象非常多。在这种情况下,为了不阻止redis,我实际上会尝试将其拆分为较小的批次并进行多次查询,假设每次1000次。它会减慢一个客户端获取数据的时间,但会使redis不会阻塞200ms,这真的很糟糕。