【问题标题】:Idiomatic approach to conditional update of key键条件更新的惯用方法
【发布时间】:2018-02-13 12:51:06
【问题描述】:

我想使用 Redis 缓存用户发送给我的最新数据。但是,我不能只使用SET,因为用户可能会乱序发送数据,我需要根据另一个键的值来调节SET,例如:

latest_timestamp = GET "latest_timestamp:<new_data.user_id>"
if latest_timestamp < new_data.timestamp {
  SET "latest_timestamp:<new_data.user_id>" new_data.timestamp
  SET "latest_data:<new_data.user_id>" new_data.to_string()
}

处理这种情况的惯用方法是什么?

【问题讨论】:

    标签: redis


    【解决方案1】:

    服务器端 Lua 脚本(请参阅 EVAL)是 IMO 惯用的方法。

    确保您的代码将两个键的全名(即进行所有替换)以及新时间戳和新数据作为参数传递。该脚本应如下所示:

    local lts = tonumber(redis.call('GET', KEYS[1]))
    local nts = tonumber(ARGV[1])
    if lts < nts then
      redis.call('SET', KEYS[1], nts)
      redis.call('SET, KEYS[2], ARGV[2])
    end
    

    【讨论】:

    • Itamar,感谢您的回复,我同意,但我将概述使用带有两个字段的时间/值的哈希如何导致对使用 Redis 集群或其他分区模式的零担忧。
    • 感谢您的评论@antirez - 我确实考虑过自己添加此注释,然后为了专注于手头的事情而放弃了它。由于 Lua 对某些人来说有点难以破解,我更愿意将这个特定的优化保留在其他讨论中:)
    猜你喜欢
    • 2013-11-07
    • 2013-03-08
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2020-03-11
    相关资源
    最近更新 更多