【问题标题】:Redis set key, val only if val matches a previous one for concurrencyRedis 设置键值,仅当 val 与前一个匹配时才具有并发性
【发布时间】:2021-09-09 23:58:27
【问题描述】:

如何做到这一点?使用 Jedis 和 Java。

我现在正在使用 hset,但这并不重要。

是否必须发送 lua 代码才能实现这一点? Jedis 是怎么做到的?

【问题讨论】:

    标签: java redis jedis keydb


    【解决方案1】:

    这是一个使用 LUA 的 HSET 命令的 Check-n-set。

    Jedis jedis;
    String key, field, oldValueToCheck, newValueToSet;
    
    jedis.eval("if redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[3]"
        + " then return redis.call('HSET', KEYS[1], ARGV[1], ARGV[2])"
        + " else return 'NA' end", 1, key, field, newValueToSet, oldValueToCheck);
    

    【讨论】:

    • 谢谢。您知道如何发送 null 作为 oldValueToSet 的值吗?空不工作。 “不”?从绝地这边。
    • 你不能。 Redis 不允许为空。可以选择专门处理来自 Java 的 'NA'/'NULL' 字符串。
    • 虽然它能够返回 null。如果不存在,Lua hget 调用也将返回 null。我不明白为什么 redis 中没有 null 的表示。我读到了一些有办法的东西,但我无法让它发挥作用。 Uno momento。
    • stackoverflow.com/a/51485500/961018 redis.io/topics/protocol#nil-reply 看来这只是回复?这根本不符合逻辑。我必须为其发送一些特殊值,该值仅在我的代码使用它的一个实例中有效。应该知道比依赖于像 LUA 这样的语言更好的东西。我不明白他们如何没有表示传入的空值。零字节数组变成天知道是什么。我无法从 lua 代码中记录它。有办法吗?
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2016-07-30
    • 2014-05-18
    相关资源
    最近更新 更多