【问题标题】:Is it possible to implement a read-modify-write cycle in Redis?是否可以在 Redis 中实现读-修改-写循环?
【发布时间】:2020-10-20 05:20:27
【问题描述】:

尝试使用 StackExchange.Redis.Extensions.AspNetCore 客户端库从 C# 访问 Redis Key,手头的问题是这个 key 必须是仅由一个客户端更改。

key 的值为0,必须改为1,但只有读取0 的客户端,在写入1 时才是一个 获得控制权。

是否在许多语言中实现了相同的信号量模式,但这是为了让多个客户端获得对某些资源的控制权,直到通过再次编写 0 来释放它。

用例是来自不同位置的多个客户端竞相向key 发出原子read-modify-write 写入1,但只有一个(首先)读取0(如果以前的客户端已经拥有它,则没有),其余读取修改后的1

有没有人使用 Redis 解决过这样的问题,有没有办法解决它或实现它的库。

【问题讨论】:

    标签: c# .net redis


    【解决方案1】:

    您可以使用 Lua 脚本来实现“读取和更新”。

    这是 Lua 的示例:

    if redis.call("get", KEYS[1]) == ARGV[1] then
        redis.call("set", KEYS[1], ARGV[2])
        return 1
    else
        return 0
    end
    

    您可以使用返回值来确定客户端是否获得控制权。

    【讨论】:

    • 但是如果两个客户端同时执行这个脚本并且:在它们中的任何一个执行second one之前都执行first line,它没有完成原子要求,因为第一次调用是不与第二个捆绑在一起。
    • 除非这个脚本在 Redis 服务器内部运行,并且服务器保证一次只运行一个脚本。想象一下 100 个客户端同时执行此操作,如果不提供该保证,其中一些客户端将获得 0,但在脚本级别这会产生巨大的性能损失,这就是为什么 read-modify-write 原子操作在许多情况下退出的原因系统(以及在 CPU 的指令级实现的硬件)。我们将尝试测试您的提案以进行验证。
    • 结果如下:freecodecamp.org/news/a-quick-guide-to-redis-lua-scripting 脚本中的所有步骤都以原子方式执行。脚本执行时,没有其他 Redis 命令可以运行。
    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    相关资源
    最近更新 更多