Redis自学笔记:4.1进阶-事务
第4章:进阶
4.1事务
4.1.1概述
redis中的事务是一组命令的集合
事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行,
要么都不执行
事务的原理是先将一个事务的命令发送给redis,然后再让redis依次执行
这些命令,例如:
127.0.0.1:6379> multi
OK
127.0.0.1:6379> sadd 'user:1:following' 2
QUEUED
127.0.0.1:6379> sadd 'user:2:following' 1
QUEUED
127.0.0.1:6379> exec
1
1
事务的使用方式:
- 首先使用 multi 命令,声明下面的命令属于同一个事务
- 发送操作命令.redis不会执行命令,而是把它们暂存起来.
返回值 queued 表示这两条命令已进入等待执行事务的队列. - 最后使用 exec 命令结束暂存命令,同时redis将事务队列中的
所有命令按照发送顺序依次执行. exec 返回值是暂存命令执
行的返回值组成的列表,返回顺序和命令顺序相同.
redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发
送exec命令前客户端断线,redis会清空事务队列.一旦发送了redis命令,
所有命令就会被执行,即使客户端断线也没有关系.
redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入.
4.1.2错误处理
导致事务执行出错的原因:
- 语法错误.
命令不存在或者命令参数的个数不对.127.0.0.1:6379> multi
OK
127.0.0.1:6379> set foo 1
QUEUED
127.0.0.1:6379> set foo
ERR wrong number of arguments for 'set' command
127.0.0.1:6379> errorcommand foo
ERR unknown command 'errorcommand'
127.0.0.1:6379> exec
EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> keys *
- 事务中的命令都没有执行
- 运行错误
命令执行时出现的错误.比如使用散列类型的命令操作集合类型的键,这
种错误在实际执行之前redis是无法发现的.如果事务里一条命令出现了
运行错误,事务里其他的命令依然会执行(包括出错命令之后的命令).127.0.0.1:6379> multi
OK
127.0.0.1:6379> set foo 1
QUEUED
127.0.0.1:6379> sadd foo 2
QUEUED
127.0.0.1:6379> set foo 3
QUEUED
127.0.0.1:6379> exec
OK
WRONGTYPE Operation against a key holding the wrong kind of value
OK
127.0.0.1:6379> keys *
foo
127.0.0.1:6379> get foo
3
redis的事务没有关系数据库提供的回滚(rollback)功能.也使得redis在事务
上可以保持简洁和快速.
4.1.3 watch命令介绍
watch命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的
事务就不会执行。监控一直持续到exec命令(事务中的命令是在exec之后才执行
的,所以在multi命令后可以修改watch监控的键值)
127.0.0.1:6379> set qux 1
OK
127.0.0.1:6379> watch qux
OK
127.0.0.1:6379> set qux 2
OK
127.0.0.1:6379> get qux
2
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set qux 3
QUEUED
127.0.0.1:6379> exec
127.0.0.1:6379> get qux
2
127.0.0.1:6379> set thud 1
OK
127.0.0.1:6379> watch thud
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set thud 2
QUEUED
127.0.0.1:6379> exec
OK
127.0.0.1:6379> get thud
2
由于watch命令的作用只是当被监控的键值被修改后阻止之后一个事务的执行,而
不能保证其他客户端不修改这一键值,所以在一般的情况下我们需要在exec执行失
败后重新执行整个函数。
执行exec命令后会取消对所有键的监控,如果不想执行事务中的命令也可以使用
unwatch命令来取消监控。
Redis自学笔记:4.1进阶-事务的更多相关文章
- Redis自学笔记:4.4进阶-消息通知
4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...
- Redis自学笔记:4.3进阶-排序
4.3排序 4.3.1有序集合的集合操作 有序集合没有zinter和zunion命令,使用其他命令实现方法: multi zinterstore tempKey ... zrange tempKey ...
- Redis自学笔记:4.2进阶-过期时间
4.2过期时间 **4.2.1命令介绍* 在redis中使用 expire 命令设置一个键的过期时间后redis会自动删除它. expire key seconds (seconds单位是秒,必须是整 ...
- redis 学习笔记——数据同步、事务
redis主从同步 redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础. redis复制原理 re ...
- Redis自学笔记:5.实践
第5章实践 5.3 python与redis 5.3.1安装 pip install redis 5.3.2使用方法 自己补充内容:Ubuntu下redis开启远程连接 打开redis配置:sudo ...
- Redis自学笔记:3.6入门-有序集合类型
3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...
- Redis自学笔记:3.5入门-集合类型
3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...
- Redis自学笔记:3.4入门-列表类型
3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...
- Redis自学笔记:3.3入门-散列类型
3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...
随机推荐
- DSB
Linux day01 计算机硬件知识整理 作业要求:整理博客,内容如下 编程语言的作用及与操作系统和硬件的关系 应用程序->操作系统->硬件 cpu->内存->磁盘 cpu与 ...
- jsp 错误处理
JSP提供了很好的错误处理能力.除了在Java代码 中可以使用try语句,还可以指定一个特殊页面.当应 用页面遇到未捕获的异常时,用户将看到一个精心设计 的网页解释发生了什么,而不是一个用户无法理解的 ...
- bzoj 5418
这是拓展crt的典型应用 在你开始做之前,我一定要告诉你一件事情:虽然这道题看着和拓展crt模板很像,但他俩是有巨大的区别的!不要直接把板子改吧改吧扔上去! 题目模型:求解模线性方程组 其中p1,p2 ...
- .NET Framework 类库——C#命名空间大全
引用地址:https://msdn.microsoft.com/zh-cn/library/gg145045.aspx C# using引用时,不知道有哪些命名空间,这下转载收集一篇,方面查找使用. ...
- CCF-CSP 第三题字符串整理(模拟大法好)
URL映射 规则的相邻两项之间用‘/’分开,所以我们先把所有项分开,然后依次把两个字符串的对应项匹配即可. 分离字符串这里用字符串流(stringstream)处理,先把所有的‘/’变为空格,然后一个 ...
- .NET Framework反射总结
概述 程序集的反射以及动态的创建类对象,是自动化编程常用的到知识原理,比如插件编程.模板设计模式,都可以采用发射机制动态的去创建实例化对象,实现类的动态加载.这里简单总结下,常用到的Framework ...
- Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
最近开始使用VS,之前用的DEV C++软件可直接使用 #include <bits/stdc++.h> ,但VS中并没有,为了使用方便,可直接在VS中添加此头文件,方法如下: 1.在安 ...
- 【Android】android文件的写入与读取---简单的文本读写context.openFileInput() context.openFileOutput()
最终效果图,点击save会保存到文件中,点击show会从文件中读取出内容并显示. main.xml <?xml version="1.0" encoding="ut ...
- python基础——dict和set(字典和集合)
1.dict:pop(),get(),in,{} >>> dicttest = {'marry':34,'jucy':56} --初始化>>> dicttest{' ...
- POJ2676 Sudoku 舞蹈链 DLX
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目(传送门) 题意概括 给出一个残缺的数独,求解.SPJ 题解 DLX + 矩阵构建 (两个传送门) 代码 #includ ...