【问题标题】:Locking Mechanism for data stored in redisredis存储数据的锁定机制
【发布时间】:2017-09-26 17:34:09
【问题描述】:

亲爱的,我遇到了一个问题,即多个 redis 客户端正在访问存储在 redis-server 中的公共结构。

要求如下:-

  1. 如果一个特定的redis-client正在访问存储在redis-server中的结构(应对结构进行读写操作),其他redis-client应该不能访问并等待被释放。
  2. 每次其他 redis 客户端访问该结构时,它们都应该访问更新后的结构。

如何在 C 代码中放置锁定机制来满足此要求。 提前致谢。

【问题讨论】:

  • Redis 事务(MULTI/EXEC)还不够吗?
  • @Not_a_Golfer - 我对 Redis 的了解有限。我存储在哈希中的结构。以下序列是否适用于 C:- MULTI -> HGET -> 对结构的某些操作,例如更新结构中的某些字段 -> HSET -> EXEC
  • 您无法使用事务观察值。如果这是您需要的,也许 Lua 脚本会更好。它以原子方式运行,直到完成。

标签: c redis locking


【解决方案1】:

Redis 提供以下功能:

1) 使用 Redis 事务和乐观锁。见Redis Transactions

2) 或者 Lua 脚本,它将在 Redis 中以原子方式执行。见EVAL

【讨论】:

    【解决方案2】:

    使用 watch 命令https://redis.io/commands/watch 检测其他客户端的修改。该命令只对redis事务中的指定key指定

    【讨论】:

      【解决方案3】:

      亲爱的,谢谢大家的回复。了解 redis 可用的各种功能和通用方式很有帮助。

      但是,当我的要求通过这种方式满足时,我采取了如下方式。

      我使用第二个时间戳(比如 t_sec)作为键,使用计数器作为哈希值。如果在那一秒内有进一步的请求,则对应于 t_sec 键的计数器值以原子方式递增(HINCRBY 命令)。其余参数本地存储在结构中。如果计数器达到特定的设置限制,则请求被丢弃。 如果这是下一秒,则使用新的 t_sec 键值,并且计数器从零开始递增。 与前一秒对应的 t_sec 键已被删除(HDEL 命令)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多