第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

事务的使用方式:

  1. 首先使用 multi 命令,声明下面的命令属于同一个事务
  2. 发送操作命令.redis不会执行命令,而是把它们暂存起来.

    返回值 queued 表示这两条命令已进入等待执行事务的队列.
  3. 最后使用 exec 命令结束暂存命令,同时redis将事务队列中的

    所有命令按照发送顺序依次执行. exec 返回值是暂存命令执

    行的返回值组成的列表,返回顺序和命令顺序相同.

redis保证一个事务中的所有命令要么都执行,要么都不执行.如果在发

送exec命令前客户端断线,redis会清空事务队列.一旦发送了redis命令,

所有命令就会被执行,即使客户端断线也没有关系.

redis的事务还能保证一个事务内的命令依次执行而不被其他命令插入.

4.1.2错误处理

导致事务执行出错的原因:

  1. 语法错误.

    命令不存在或者命令参数的个数不对.
    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 *
    • 事务中的命令都没有执行
  2. 运行错误

    命令执行时出现的错误.比如使用散列类型的命令操作集合类型的键,这

    种错误在实际执行之前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进阶-事务的更多相关文章

  1. Redis自学笔记:4.4进阶-消息通知

    4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...

  2. Redis自学笔记:4.3进阶-排序

    4.3排序 4.3.1有序集合的集合操作 有序集合没有zinter和zunion命令,使用其他命令实现方法: multi zinterstore tempKey ... zrange tempKey ...

  3. Redis自学笔记:4.2进阶-过期时间

    4.2过期时间 **4.2.1命令介绍* 在redis中使用 expire 命令设置一个键的过期时间后redis会自动删除它. expire key seconds (seconds单位是秒,必须是整 ...

  4. redis 学习笔记——数据同步、事务

    redis主从同步      redis支持简单易用的主从复制(master-slave replication)功能,该功能也是redis高可用性实现的基础.   redis复制原理      re ...

  5. Redis自学笔记:5.实践

    第5章实践 5.3 python与redis 5.3.1安装 pip install redis 5.3.2使用方法 自己补充内容:Ubuntu下redis开启远程连接 打开redis配置:sudo ...

  6. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  7. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  8. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

  9. Redis自学笔记:3.3入门-散列类型

    3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...

随机推荐

  1. LeetCode(118):杨辉三角

    Easy! 题目描述: 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1] ...

  2. 三维拓扑排序好题hdu3231

    /* 三维拓扑排序 将每个长方体分解成六个面,xyz三维进行操作 每一维上的的所有长方体的面都应该服从拓扑关系,即能够完成拓扑排序=如果两个长方体的关系时相交,那么其对应的三对面只要交叉即可 如 a1 ...

  3. poj2817状态压缩 升维

    /* 两两求出字符串之间最大可以匹配的值 由已知状态推导出位置状态 状态s表示已经加入到集合中的字符串,0表示串i不存在,1存在 由于字符串的加入顺序会影响结果,所以增加一维来表示 dp[S][i]表 ...

  4. python unittest装载、执行、造成报告

    #执行用例 caselist = config.caselist for i in range(0,len(caselist)): reportname = caselist[i][2:] now = ...

  5. Java charAt() 方法

    charAt() 方法用于返回指定索引处的字符.索引范围为从 0 到 length() - 1. 参数 index -- 字符的索引. 返回值 返回指定索引处的字符. 实例 public class ...

  6. 20165328 预备作业3 Linux安装及命令

    Linux安装及学习 Linux安装遇到的问题: 问题:在我开始安装虚拟机的时候,在安装过程中总会出现初始界面,且无法跳过,陷入死循环. 解决方法:我在网上百度搜索该问题之后得到了答案,第一个界面是要 ...

  7. Vue-切割json数组字符串并循环输出

    Json "detailList":[ " 04/08/2016 - LA - - Dept. - TITLE (Lien Reported)", " ...

  8. JQuery调用WCF服务

    一:创建一个wcf服务项目 [ServiceContract] public interface IService1 { [OperationContract] [WebInvoke(RequestF ...

  9. [转] Nodejs 进阶:Express 常用中间件 body-parser 实现解析

    写在前面 body-parser是非常常用的一个express中间件,作用是对post请求的请求体进行解析.使用非常简单,以下两行代码已经覆盖了大部分的使用场景. app.use(bodyParser ...

  10. Java基础知识➣Stream整理(二)

    概述 在Java数据流用到的流包括(Stream).文件(File流)和I/O流 ,利用该三个流操作数据的传输. Java控制台输入输出流 读取控制台使用数据流: BufferedReader和Inp ...