Redis中的WATCH命令的行为方式与Java中的volatile变量相同吗



对于Redis事务概念的工作原理,我有点犹豫。

据我所知,事务是multiexec之间的命令列表,它不会立即执行,但会推迟到调用exec

让我们假设我以原子的方式为Redis赋予了一些价值:

MULTI
get current value and increment
EXEC

此时,一个新线程突然出现,并试图读取如上所示存储的值。这是否意味着在事务完成之前,这个值将不可用,并且由于这个值没有被读取,这个线程将以错误的方式执行他的逻辑?

为了让线程在事务运行的同时读取这个值,我需要使用WATCH,它的作用与volatile变量完全相同——存储对被事务阻塞的值的访问?

请查看Redis Transactions文档-https://redis.io/topics/transactions.

首先,您需要记住Redis是单线程的。当您在调用MULTI后发送命令时,Redis不执行该命令,而只执行QUEUED。仅当调用EXEC时,主线程(唯一的执行线程(正在运行事务中的所有QUEUED命令。因此,没有其他客户能够阅读部分牵引力。

至于WATCH,它不用作volatile,而仅作为Redis的一个指标,即如果在对WATCH的调用和对EXEC的调用之间更改了此密钥,则事务不应失败而未提交。

使用WATCH可以确保在WATCHMULTI之间进行的任何读取在调用EXEC时仍然有效。

最新更新