redis - 如何在redis上同步多个writer?

标签 redis synchronization

我有多个编写器覆盖了 Redis 中的同一个键。我如何保证只有选择的最后写入?

我可以在 Redis 中执行写同步而不先同步写入器吗?


背景: 在我的系统中,一个独特的调度员将工作发送给不同的 worker 。然后每个工作人员将结果写入 Redis 并覆盖相同的 key 。我需要确保只有最后一个从调度员那里收到工作的 worker 在 Redis 中写入。

最佳答案

使用有序集 (ZSET):添加得分等于 unix 时间戳的条目,然后删除除最高排名以外的所有条目。

一个 Redis Ordered set是一个集合,其中每个条目也有一个分数。集合根据分数排序,元素在有序集合中的位置称为Rank。

按顺序:

  1. 删除分数等于或小于您要添加的分数的所有条目(zremrangebyscore)。由于您要添加到集合中,如果您的值重复,您的新条目将被忽略,您希望保留排名最高的条目。
  2. 将您的值添加到 zset ( zadd )
  3. 按排名删除所有条目,但排名最高的条目 (zremrangebyrank)
  4. 你应该在交易中完成它(pipeline)

Python 示例:

# timestamp contains the time when the dispatcher sent a message to this worker
key = "key_zset:%s"%id
pipeline = self._redis_connection.db.pipeline(transaction=True)
pipeline.zremrangebyscore(key, 0, t)  # Avoid duplicate Scores and identical data
pipeline.zadd(key, t, "value")
pipeline.zremrangebyrank(key, 0, -2)
pipeline.execute(raise_on_error=True)

关于redis - 如何在redis上同步多个writer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273498/

相关文章:

redis - 是否可以使用 redis 集群而不是哨兵作为 Airflow 集群的 celery 后端

c# - Redis StringSetAsync 在使用 Moq 的单元测试中返回 false

Java同步文件写入

Java/安卓 : Synchronized vs Queue implementation

laravel Echo 不监听 channel 和事件

ruby-on-rails - Resque 未从配置中选择正确的服务器

mongodb - MongoDB和Redis有什么区别?

synchronization - 如何避免服务器端和客户端的重复验证?

c++ - WINAPI 事件对象意外行为

java - 这是 'double check' 反模式的情况吗? (获取一个map条目,不存在则创建)