Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 具有事件驱动程序的Redis multi/exec_Ruby_Redis_Eventmachine - Fatal编程技术网

Ruby 具有事件驱动程序的Redis multi/exec

Ruby 具有事件驱动程序的Redis multi/exec,ruby,redis,eventmachine,Ruby,Redis,Eventmachine,如何在事件Redis驱动程序中使用MULTI/EXEC(和WATCH),例如em-hiredis(使用EventMachine的Ruby驱动程序)?如果我跑步: redis.multi do redis.sadd("foo", "bar") do redis.inc("baz", "qux") do redis.exec do puts 'yay!' end end end end 如果有很多事情发生,应用程序的其他部分可能会在执

如何在事件Redis驱动程序中使用
MULTI
/
EXEC
(和
WATCH
),例如
em-hiredis
(使用EventMachine的Ruby驱动程序)?如果我跑步:

redis.multi do
  redis.sadd("foo", "bar") do
    redis.inc("baz", "qux") do
      redis.exec do
        puts 'yay!'
      end
    end
  end
end
如果有很多事情发生,应用程序的其他部分可能会在执行
之前偷偷地执行操作(例如,假设我有一个计时器,它每秒钟递增一个键,并且上面的代码需要超过一秒钟的时间来运行,那么一些递增命令将作为
MULTI
/
EXEC
的一部分发送--如果我想中止事务怎么办?那么任何碰巧成为它一部分的递增命令都将被删除。)出现。很容易出现更糟糕的情况)


我想我可以实现某种类型的锁定,这样在执行
MULTI
/
EXEC
的过程中就不能执行其他操作,但这并不是一个很好的解决方案,还有其他人找到更好的方法吗?

正如@balu在对问题的评论中所说的,没有多个连接就无法完成。

你有没有更好的解决方案看,它有一个em Hiredisys的处理程序,我知道关于
em synchrony
,但它不会改变任何事情。事情仍然会以相同的顺序发生,只是更容易看到控制流(但在这种情况下,我会说它也会使竞争条件不那么明显)。要使这类功能正常工作,您必须打开一个单独的连接或使用连接池。哦,顺便说一句:您也可以使用新的redis
scripting
分支,它允许您将LUA脚本作为命令发送。我刚才在#redis与一些开发人员进行了交谈,他们确认了这一点。我认为在这里使用连接池是一件非常好的事情。:)如果有人愿意为这个问题写一个正确的答案,我会很乐意把它作为被接受的答案,并删除这个。嗨,你能回答吗,谢谢