transactions - 在 Redis 中,当存在没有关联的 EXEC 或 DISCARD 的 MULTI 时会发生什么?

标签 transactions redis

我有一系列在 Redis 集之间移动元素的脚本。有时这些操作需要是原子的。有时一个脚本会失败,但其他脚本会继续工作。

我很好奇如果在一个脚本中我运行 MULTI 并启动但随后脚本以某种方式失败并且我从不调用 EXEC 或 DISCARD 会发生什么 - 我知道我的数据完整性很好因为事务永远不会发生,但是由于命令在某处排队并且从未执行 我担心如果这种情况发生得太频繁(不应该,但谁知道呢?)我需要清理队列吗?

最佳答案

取决于“脚本失败”的确切含义

如果与 redis 服务器的连接丢失,则查询缓冲区将被释放。

如果与redis服务器的连接仍然活跃,而你的代码的其他部分根本没有使用它,那么查询缓冲区将继续占用服务器上的内存。默认情况下,空闲客户端连接不会终止。如果您在 redis.conf 中指定了 timeout,查询缓冲区最终将被回收。

如果与 redis 服务器的连接仍然有效,并且脚本中的另一个模块/函数/ block 重用了该连接,事情就会变得更有趣。它们执行的任何命令都会在服务器上排队,因为它们是前面多 block 的一部分。如果此模块启动另一个 multi,redis 服务器将响应“(错误)ERR MULTI 调用无法嵌套”,但查询缓冲区不会被清除。您的应用程序的行为方式在很大程度上取决于您使用的 Redis 驱动程序。

关于transactions - 在 Redis 中,当存在没有关联的 EXEC 或 DISCARD 的 MULTI 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12063136/

相关文章:

list - Redis 嵌套键列表

php - 为什么使用innoDB和事务?

sql - 在不锁定表的情况下循环遍历 PL/PGSQL 中的 CURSOR

c# - 我怎样才能像在终端上一样获取集群信息,但在我的 c# 客户端 (stackexchange) 上?

scalability - 可扩展的实时发布/订阅引擎

redis - Logstash、elasticsearch、Kibana,包括IP

heroku - WebSocket 推送数据库更新

java - 使用 spring + JPA 在乐观锁定中处理 LockModeType

mysql - 想要在以下程序中应用交易,但它不起作用

django - "transaction.atomic"与 "transaction.commit_on_success"相同吗?