Redis:座圈条件和单线程

Redis:座圈条件和单线程,redis,Redis,我是Redis新手,正在阅读《Redis in Action》一书,书中详细介绍了竞争条件和不同的锁定机制,以避免出现这种情况(专门有一章介绍)。 但是在一些StackOverflow文章中讨论了Redis是单线程的。 链接如下: 在上面的链接(在其中一个答案中)中明确指出,当命令执行时,不会运行其他命令。 现在我的问题是:若Redis是单线程的,那个么为什么需要锁机制呢 请澄清这一点,并让我知道,如果我的理解有任何错误 它还遵循乐观锁定机制,其中多个线程可能会尝试更新数据,如果数据被修改,它

我是Redis新手,正在阅读《Redis in Action》一书,书中详细介绍了竞争条件和不同的锁定机制,以避免出现这种情况(专门有一章介绍)。 但是在一些StackOverflow文章中讨论了Redis是单线程的。 链接如下:

在上面的链接(在其中一个答案中)中明确指出,当命令执行时,不会运行其他命令。

现在我的问题是:若Redis是单线程的,那个么为什么需要锁机制呢

请澄清这一点,并让我知道,如果我的理解有任何错误

它还遵循乐观锁定机制,其中多个线程可能会尝试更新数据,如果数据被修改,它将被通知给同时尝试更新的其他线程(由于更新失败,它们可以再次重试相同的操作)

若Redis是单线程的,那个么为什么需要锁定机制呢

Redis实际上(大部分)是单线程的,但当多个客户端试图在相邻的时间范围内做不同的事情时,需要锁定。RiA中讨论的锁定正是关于这一点——确保只有一个客户机/线程执行特定任务,或者确保更新不会出错

下面是一个例子,说明为什么在Redis的单线程状态下需要锁定:假设您在Redis中有一个值,例如一个存储在名为
foo
的键下的数字。你的应用程序的代码读取该数字(
GET foo
),做一些事情(例如添加1)并将其写回(
SET
)。当您在单个线程中运行代码时,其外观如下:

App               Redis
 |---- GET foo ---->|
 |<------ 1 --------|
 |                  |
 | thinking...      |
 |                  |
 |--- SET foo 2 --->|
 |<----- OK --------|
App-Redis
|----获取foo-->|
||
||                  |
||                  |

|根据我的理解:Redis命令本身就是原子的。在执行原子命令时,没有任何数据竞争的范围。但是如果我们希望作为一个原子执行多个命令{这样就不会受到其他客户端的干扰},那么我认为事务就是答案。让我们在上面的例子中说:客户端程序可以是:get x//做一些工作;增量x;在这里,get x是以原子方式执行的,但当incr x出现时,它将接受过时的值或更新的once。可以使用MULTI/EXEC块(可选地与WATCH一起使用)或Lua脚本来获得类似事务的原子性。
App 1             Redis              App 2
 |---- GET foo ---->|                  |
 |<------ 1 --------|<--- GET foo -----|
 |                  |------- 1 ------->|
 | thinking...      |                  |
 |                  |       thinking...|
 |--- SET foo 2 --->|                  |
 |<----- OK --------|<--- SET foo 2 ---|
 |                  |------ OK ------->|