我有多个编写器覆盖了 Redis 中的同一个键。我如何保证只有选择的最后写入?
我可以在 Redis 中执行写同步而不先同步写入器吗?
背景: 在我的系统中,一个独特的调度员将工作发送给不同的 worker 。然后每个工作人员将结果写入 Redis 并覆盖相同的 key 。我需要确保只有最后一个从调度员那里收到工作的 worker 在 Redis 中写入。
最佳答案
使用有序集 (ZSET):添加得分等于 unix 时间戳的条目,然后删除除最高排名以外的所有条目。
一个 Redis Ordered set是一个集合,其中每个条目也有一个分数。集合根据分数排序,元素在有序集合中的位置称为Rank。
按顺序:
- 删除分数等于或小于您要添加的分数的所有条目(zremrangebyscore)。由于您要添加到集合中,如果您的值重复,您的新条目将被忽略,您希望保留排名最高的条目。
- 将您的值添加到 zset ( zadd )
- 按排名删除所有条目,但排名最高的条目 (zremrangebyrank)
- 你应该在交易中完成它(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/