【问题标题】:Redis mget showing in SLOWLOGRedis mget 显示在 SLOWLOG 中
【发布时间】:2018-02-13 16:32:12
【问题描述】:

我正在使用 redis 来存储一些针对唯一字符串键的 json 值。由于某些要求,我必须在 1 次中获取多个键值对(精确为 15 K),为此我使用 C++ 和 cpp_redis 使用 MGET redis 命令。

系统工作正常,但时间上有些问题。 MGET 很慢,我在 c++ 中观察到大约 200+ 毫秒的延迟,并且它也显示在 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)"

是否有任何最佳实践或特定的事情可以做来加快调用速度。

【问题讨论】:

    标签: c++ redis


    【解决方案1】:

    MGET 取决于两个因素:

    1. 您获取的密钥数量。每次提取都是 O(1),所以 N 提取当然是 O(N)。 1000 个键将比 100 个键慢约 10 倍。没办法

    2. 每个对象的大小 - 对象越大,序列化响应所需的时间就越多。

    一个 MGET 的 15K 个对象是相当多的。在这种情况下,为了不阻塞 redis,我实际上会尝试将它分成更小的批次并执行多个查询,假设每个查询 1000 个。它会减慢一个客户端获取数据的时间,但会使 redis 不会阻塞 200 毫秒,这真的很糟糕。

    【讨论】:

    • 基本上你是在建议对键数组进行分块,但如果按顺序完成会很耗时,并且并发需要在每个 api 请求中启动线程也不是一个好主意。
    • @NirmalVatsyayan 假设您有 100 个客户端在工作,其中一些客户端的请求较小,例如编写对象。如果较长的请求每个阻塞 redis 200 毫秒,那么您的短请求也会阻塞那么长的时间。如果您将其拆分为许多较小的请求,则较长的请求会花费更长的时间(不是很多),但较短的请求会更快地完成。简而言之,没有其他方法可以加速这一进程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-27
    相关资源
    最近更新 更多