Redis时间向前跳和向后跳

  • 本文关键字:时间 Redis redis
  • 更新时间 :
  • 英文 :


这个脚本显示redis返回的时间戳似乎向前跳了很多次,然后又不时地向后跳。这种情况在跑步过程中经常发生,在每次跑步中。这是怎么呢这在哪里有记录吗?我无意中发现了这个,因为它弄乱了我的滑动窗口速率限制器。

res_0, res_1 = 0, 0
for _ in range(200):
    script = f"""
        local time = redis.call("TIME")
        local current_time = time[1] .. "." .. time[2]
        return current_time
    """
    res_0 = res_1
    res_1 = float(await redis.eval(script, numkeys=0))
    print(res_1 - res_0)
    time.sleep(0.01)
1667745169.747809
0.011765003204345703
0.01197195053100586
0.011564016342163086
0.011634111404418945
0.012428998947143555
0.011847972869873047
0.011600971221923828
0.011788129806518555
0.012033939361572266
0.012130022048950195
0.01160883903503418
0.011954069137573242
0.012022972106933594
0.011958122253417969
0.011713981628417969
0.011844873428344727
0.012138128280639648
0.011618852615356445
0.011570215225219727
0.011890888214111328
0.011478900909423828
0.7928261756896973
-0.5926899909973145
0.11812996864318848
0.11584997177124023
0.12353992462158203
0.1199800968170166
0.11719989776611328
0.12331008911132812
-0.8117339611053467
0.011723995208740234
0.01131582260131836

最可能的原因是浮点运算在调用代码端:解析浮点数将不可避免地四舍五入(不确定范围,因为您没有告诉您针对哪个平台进行编码)输入值和原始结果精度丢失。因此,我建议检查您的逻辑,以便您使用一对整数/长整数来独立处理TIME返回的结果的两个组成部分。

除此之外,除了明显的Redis服务器时钟问题的可能性之外,你也可能有机会在每次迭代中联系不同的Redis主机——这可能在你使用多节点Redis拓扑(复制或集群)的情况下是正确的。

最新更新