2017-01-09 52 views
1

我已阅读过多篇有关redis交易的文章。 我有一些包含消息的列表。我使用redis为这些消息生成自动递增ID。 这里就是我想要做的事:固定客户数量的Redis交易

  1. 阅读计数器的值,然后增量它。
  2. 将递增的计数器值放入消息的Id字段中,然后序列化消息。
  3. 将序列化消息推送到列表中。

所以计数器总是在对应的列表中保存最后一条消息的ID。我想锁定计数器密钥,以便其他请求无法读取INCR计数器,并将另一条消息推送到与最后一个ID冲突的列表中。

因为我想要有限数量的redis客户端,所以WATCH MULTI EXCEC无法实现,因为它是执行该事务的同一个客户端。而据我所知,WATCH MULTI EXCEC适用于多个redis客户端。

我想知道什么是这个问题的正确方法。我应该使用LUA脚本并让它序列化消息吗?

回答

2

Lua无疑是创建读写数据的原子逻辑单元的最佳选择。

然而就你而言,我并不相信原子性是真正需要的。除非严格要求ID之间没有间隔,否则可以拨打INCRBY以获取新ID,然后将其用于序列化消息。其他消息将而不是获得相同的ID和唯一的“风险”是让你的工人在使用该ID序列化和存储消息(因此造成差距)之前死亡。

+0

我想到的“风险”是列表中的最后一条消息可能没有与计数器相同的ID。 –

+0

很确实,列表中消息的顺序不一定是正确的,没有原子性。如果这是一项要求,请与Lua一起去。 –