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
Transactions Redis中的RPUSH和LPUSH可以竞争吗?_Transactions_Redis_Race Condition - Fatal编程技术网

Transactions Redis中的RPUSH和LPUSH可以竞争吗?

Transactions Redis中的RPUSH和LPUSH可以竞争吗?,transactions,redis,race-condition,Transactions,Redis,Race Condition,推送多个项目时,redis.io上的RPUSH和LPUSH上的文档不清楚这些操作是否仍然是O(1)和transational。例如,如果两个客户端对具有多个项的同一列表执行RPUSH,那么它们的项是否会分散并因此失去顺序 塔德曼对他的回答的评论为我澄清了这一点:因为Redis是单线程的,所以不存在它们“同时”发生的情况,一个总是在另一个之前到达,尽管时间常常超出你的控制 现在,如果您有两个流程可以以某种方式进行协调,那么您可以让一个流程延迟到另一个流程,直到该操作完成。如果你关心这个问题,你可以

推送多个项目时,redis.io上的
RPUSH
LPUSH
上的文档不清楚这些操作是否仍然是O(1)和transational。例如,如果两个客户端对具有多个项的同一列表执行
RPUSH
,那么它们的项是否会分散并因此失去顺序


塔德曼对他的回答的评论为我澄清了这一点:

因为Redis是单线程的,所以不存在它们“同时”发生的情况,一个总是在另一个之前到达,尽管时间常常超出你的控制

现在,如果您有两个流程可以以某种方式进行协调,那么您可以让一个流程延迟到另一个流程,直到该操作完成。如果你关心这个问题,你可以创建某种悲观锁,尽管这只是一种解决方案

所以简单的回答是,是的,它们将以随机顺序到达


这就是为什么Redis实现了在事务中批处理事务的命令。这些事务将以原子方式应用。

因为Redis是单线程的,所以不存在“同时”发生这些事务的情况,一个事务总是在另一个事务之前到达,尽管时间常常超出您的控制范围

现在,如果您有两个流程可以以某种方式进行协调,那么您可以让一个流程延迟到另一个流程,直到该操作完成。如果你关心这个问题,你可以创建某种悲观锁,尽管这只是一种解决方案

所以简单的回答是,是的,它们将以随机顺序到达


这就是为什么Redis实现了在事务中批处理事务的命令。这些事务将以原子方式应用。

因此每个命令都将以随机顺序到达,这意味着您不能保证RPUSH
a
发生在RPUSH
b
之前,但Redis的单线程设计确保
a
的项不会与
b
的项混杂在一起?也就是说,结果要么是
ab
,要么是
ba
,但不是
a
b
项的合并?是的,两个操作基本上不可能直接冲突,但大多数数据库都是这样工作的。别忘了你可以
RPUSH
多个项目,并且一个命令是原子地应用的,只有多个命令会被散布,并且只有当它们没有封装在
MULTI
语句中时。所以每个命令都会以随机顺序到达,这意味着你不能保证RPUSH
a
发生在RPUSH
b
之前,但是Redis的单线程设计确保了
a
的项目不会与
b
的项目混杂在一起?也就是说,结果要么是
ab
,要么是
ba
,但不是
a
b
项的合并?是的,两个操作基本上不可能直接冲突,但大多数数据库都是这样工作的。不要忘记,您可以
RPUSH
多个项目,并且一个命令是以原子方式应用的,只有多个命令才会散布,并且只有在它们没有封装在
MULTI
语句中时。