zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Redis开发运维实践专题功能之事务

Redis事务运维开发 功能 实践 专题
2023-09-11 14:15:59 时间
3.2 事务

用Multi(Start Transaction)、Exec(Commit)、Discard(Rollback)实现。 在事务提交前,不会执行任何指令,只会把它们存到一个队列里,不影响其他客户端的操作。在事务提交时,批量执行所有指令。 一般情况下redis在接受到一个client发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令后,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就结束事务上下文。

Redis还提供了一个Watch功能,你可以对一个key进行Watch,然后再执行Transactions,在这过程中,如果这个Watched的值进行了修改,那么这个Transactions会发现并拒绝执行。

使用discard命令来取消一个事务。

注意:redis只能保证事务的每个命令连续执行(因为是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的,也因此就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到"这个让人万分头痛的问题),但是如果事务中的一个命令失败了,并不回滚其他命令。另外,一个十分罕见的问题是当事务的执行过程中,如果redis意外的挂了。只有部分命令执行了,后面的也就被丢弃了。注意,如果是笔误,语法出现错误,则整个事务都无法执行。

一个简单案例表明出错也不会回滚:

127.0.0.1:6379 del q1

(integer) 0

127.0.0.1:6379 exists q1

(integer) 0

127.0.0.1:6379 multi

127.0.0.1:6379 rpush q1 bar

QUEUED

127.0.0.1:6379 scard q1

QUEUED

127.0.0.1:6379 exec

1) (integer) 1

2) (error) WRONGTYPE Operation against a key holding the wrong kind of value

127.0.0.1:6379 exists q1

(integer) 1

当然如果我们使用的append-only file方式持久化,redis会用单个write操作写入整个事务内容。即是是这种方式还是有可能只部分写入了事务到磁盘。发生部分写入事务的情况下,redis重启时会检测到这种情况,然后失败退出。可以使用redis-check-aof工具进行修复,修复会删除部分写入的事务内容。修复完后就能够重新启动了。


Redis开发运维实践指南

本文为《Redis开发运维实践指南》内容,该书作者为黄鹏程,已授权云栖社区转载。


阿里云-DataWorks-数据分析开发到上线运维 本文主要讲解 阿里云-DataWorks- 数据分析开发到上线运维 的思路。 因本文为IT人员以技术视角阐述 日常我们做数据分析的实际开发过程所转化,适合数据分析相关人员阅读。
【SpringBoot2】运维实用篇-多环境开发 什么是多环境?其实就是说你的电脑上写的程序最终要放到别人的服务器上去运行。每个计算机环境不一样,这就是多环境。常见的多环境开发主要兼顾3种环境设置,开发环境——自己用的,测试环境——自己公司用的,生产环境——甲方爸爸用的。因为这是绝对不同的三台电脑,所以环境肯定有所不同,比如连接的数据库不一样,设置的访问端口不一样等等。
《MySQL 技术大全:开发、优化与运维实战》电子版地址 MySQL 具有小巧、灵活和免费等特性,这使得它越来越多地被用于企业的实际开发中。 特别是 MySQL 数据库的开源特性,更使它得到了广泛应用。程序员要想进入 MySQL 开发 领域,除了需要有扎实的编程基础外,还需要掌握 SQL 语句的编写,熟悉 MySQL 数据库的 优化和运维,了解 MySQL 数据库的常见故障和解决方案,这样才能在竞争日益激烈的数据 库领域提高竞争力,进而实现自身的价值。