Redis 中的 WATCH 命令与 Java 中的 volatile 变量的行为方式相同吗?
Does the command WATCH in Redis behave in the same way as volatile variable in Java?
我对 Redis 事务概念的工作原理有点犹豫。
据我所知,事务是 multi
和 exec
之间的命令列表,它不会立即执行,但会延迟到 exec
被调用。
假设我以原子方式为 Redis 赋值:
MULTI
get current value and increment
EXEC
就在此时,新线程出现并尝试读取如上所示存储的值。这是否意味着在事务完成之前此值将不可用,并且此线程将以错误的方式执行其逻辑,因为尚未读取此值?
并且为了让线程有可能读取这个值,同时事务是 运行 我需要使用 WATCH
,它与 volatile 变量完全相同 - 存储对值的访问,这是一种被交易阻止?
请查看 Redis 事务文档 - https://redis.io/topics/transactions。
首先,您需要记住 Redis 是单线程的。
当您在调用 MULTI
后发送命令时,Redis 不会执行该命令,而只是 QUEUED
它。
只是,当 EXEC
被调用时,主线程(唯一的执行线程)是 运行 事务中的所有 QUEUED
命令。因此,没有其他客户可以阅读部分内容。
至于WATCH
,它不用作volatile
,而只是作为Redis的指示器,如果在调用WATCH
和调用[=之间更改了此键12=] 事务不应失败未提交。
使用 WATCH
可以确保在 WATCH
和 MULTI
之间完成的任何读取在调用 EXEC
时仍然有效。
我对 Redis 事务概念的工作原理有点犹豫。
据我所知,事务是 multi
和 exec
之间的命令列表,它不会立即执行,但会延迟到 exec
被调用。
假设我以原子方式为 Redis 赋值:
MULTI
get current value and increment
EXEC
就在此时,新线程出现并尝试读取如上所示存储的值。这是否意味着在事务完成之前此值将不可用,并且此线程将以错误的方式执行其逻辑,因为尚未读取此值?
并且为了让线程有可能读取这个值,同时事务是 运行 我需要使用 WATCH
,它与 volatile 变量完全相同 - 存储对值的访问,这是一种被交易阻止?
请查看 Redis 事务文档 - https://redis.io/topics/transactions。
首先,您需要记住 Redis 是单线程的。
当您在调用 MULTI
后发送命令时,Redis 不会执行该命令,而只是 QUEUED
它。
只是,当 EXEC
被调用时,主线程(唯一的执行线程)是 运行 事务中的所有 QUEUED
命令。因此,没有其他客户可以阅读部分内容。
至于WATCH
,它不用作volatile
,而只是作为Redis的指示器,如果在调用WATCH
和调用[=之间更改了此键12=] 事务不应失败未提交。
使用 WATCH
可以确保在 WATCH
和 MULTI
之间完成的任何读取在调用 EXEC
时仍然有效。