redis高级应用-事务

一、redis的事务

二、redis实现事务

三、redis事务问题

一、redis的事务

事务提供了一种“将多个命令打包,然后一次性、按顺序地运行”的机制。 而且事务在运行的期间不会主动中断 —— server在运行完事务中的全部命令之后, 才会继续处理其它client的其它命令。

二、redis实现事务

redis 通过 multi 、disacrd、exec 和 watch四个命令来实现事务功能

1、redis事务简单样例

127.0.0.1:6379> multi

OK

127.0.0.1:6379>set name xiaobei

QUEUED

127.0.0.1:6379>get name

QUEUED

127.0.0.1:6379>exec

1)OK

2)"xiaobei"

2、具体解释redis事务过程

2.1、一个事务从開始到运行会经历下面三个阶段:a、開始事务。

b、命令入队。c、运行事务。

2.1.1、開始事务

127.0.0.1:6379>multi

(备注: 这个命令的作用就是让client从非事务状态切换到事务状态)

2.1.2、命令入队

127.0.0.1:6379> set name xiaobei

QUEUED

(备注: 假设client处于非事务状态下,所有发送给服务端的命令都会马上运行。相反,server在收到来自client的命令时,不会马上运行命令, 而是将这些命令所有放进一个事务队列里, 然后返回 QUEUED 。 表示命令已入队)

命令入队的流程图:

2.1.3、运行事务

127.0.0.1:6379>exec

1)OK

2)"xiaobei"

(备注: 当 exec 命令运行时, server依据client所保存的事务队列。以先进先出(FIFO)的方式运行事务队列中的命令: 最先入队的命令最先运行, 而最后入队的命令最后运行。当事务队列里的全部命令被运行完之后, exec命令会将回复队列作为自己的运行结果返回给client。 client从事务状态返回到非事务状态, 至此, 事务运行完成)

运行事务的流程图:

3、撤销事务

127.0.0.1:6379> multi

OK

127.0.0.1:6379>set name xiaobei

QUEUED

127.0.0.1:6379>discard

OK

127.0.0.1:6379>exec

(error) ERREXEC without MULTI

(备注: discard 命令用于取消一个事务。 它清空client的整个事务队列。 然后将client从事务状态调整回非事务状态,最后返回字符串 OK 给client, 说明事务已被取消)

4、带watch的事务

watch 命令用于在事务開始之前监视随意数量的键: 当调用 exec命令运行事务时。 假设随意一个被监视的键已经被其它client改动了,那么整个事务不再运行, 直接返回失败

4.1、样例

4.2、下面表格展示了clientA是怎样失效

时间

clientA

clientB

t1

watch name

t2

multi

t3

set name xiaobei

t4

set name hello

t5

exec

(备注: 在时间 t4 ,client B 改动了 name 键的值, 当client A 在 t5 运行 exec 时,Redis 会发现 name 这个被监视的键已经被改动,因此client A 的事务不会被运行,而是直接返回失败)

三、redis事务问题

1、为什么redis不支持回滚

a、redis 命令仅仅会由于错误的语法而失败(而且这些问题不能在入队时发现)。或是命令用在了错误类型的键上面:这也就是说,从有用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现。而不应该出如今生产环境中

b、由于不须要对回滚进行支持,所以 Redis 的内部能够保持简单且高速

2、事务状态下的 discard、multi和watch命令

除了 exec之外, server在client处于事务状态时。不增加到事务队列而直接运行的另外三个命令是 discard、multi和watch。

discard命令用于取消一个事务。 它清空client的整个事务队列,然后将client从事务状态调整回非事务状态。 最后返回字符串 OK 给client。 说明事务已被取消。

redis的事务是不可嵌套的, 当client已经处于事务状态。而client又再向server发送 multi时, server仅仅是简单地向client发送一个错误, 然后继续等待其它命令的入队。 multi命令的发送不会造成整个事务失败, 也不会改动事务队列中已有的数据。

watch仅仅能在client进入事务状态之前运行, 在事务状态下发送watch命令会引发一个错误, 但它不会造成整个事务失败, 也不会改动事务队列中已有的数据(和前面处理 multi的情况一样)

3、在事务和非事务状态下运行命令

a、非事务状态下的命令以单个命令为单位运行,前一个命令和后一个命令的client不一定是同一个;而事务状态则是以一个事务为单位,运行事务队列中的全部命令:除非当前事务运行完成,否则server不会中断事务,也不会运行其它client的其它命令。

b、在非事务状态下,运行命令所得的结果会马上被返回给client;而事务则是将全部命令的结果集合到回复队列,再作为 EXEC 命令的结果返回给client

4、事务中的错误

1、使用事务时可能会遇上下面两种错误:

a、事务在运行EXEC 之前。入队的命令可能会出错。比方说。命令可能会产生语法错误(參数数量错误。參数名错误,等等)。或者其它更严重的错误。比方内存不足(假设server使用 maxmemory 设置了最大内存限制的话)。

b、命令可能在EXEC 调用之后失败。举个样例。事务中的命令可能处理了错误类型的键,比方将列表命令用在了字符串键上面等。

2、实例

(备注: 最重要的是记住这样一条, 即使事务中有某条/某些命令运行失败了。 事务队列中的其它命令仍然会继续运行—— redis 不会停止运行事务中的命令)

小贝_redis 高级应用-事务的更多相关文章

  1. 小贝_redis高级应用-公布与订阅

    redis高级应用-公布与订阅 一.公布与订阅(pub/sub)功能 二.公布与订阅(pub/sub)机制 三.redis公布与订阅(pub/sub)的实现 一.公布与订阅(pub/sub)功能 Pu ...

  2. 小贝_redis高级应用-安全性

    redis高级应用-安全性 一.为什么redis须要安全性 二.设置redis验证password 三.验证   一.为什么redis须要安全性 1.redis作为数据的存储介质.假设无法保证redi ...

  3. 小贝_redis list类型学习

    redis  list类型 一.查看list类型的命令 二.list命令具体解释 一.查看list类型的命令 1.在终端数据 help @list 127.0.0.1:6379>help @li ...

  4. 小贝_redis hash类型学习

    Redis  Hash类型 一.查看hash类型的命令 二.操作hash命令具体解释 一.查看hash类型的命令 1.输入 help@hash 127.0.0.1:6379>help @hash ...

  5. 小贝_redis web管理界面工具安装

    RedisWEB管理界面工具安装 一.概述 二.文件下载 三.安装过程 一.概述 1.因为redis是基于C/S的方式开发.也就是说,仅仅要满足于redis的client通信要求的,都能够作为redi ...

  6. 论Postgres的“已提交的而且 xmin’比当前事务的XID小的记录对当前事务才是可见的”

    最近在网上看到这样一句话Postgres“已提交的而且 xmin 比当前事务的XID小的记录对当前事务才是可见的”.先不评断这句话的正确性:看下这句话的结构,因果关系: 按照此话的意思:要postgr ...

  7. Mysql高级之事务

    原文:Mysql高级之事务 通俗的说事务: 指一组操作,要么都成功执行,要么都不执行.---->原子性 在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程-->隔离性 事务发生 ...

  8. 小贝_php+redis简单实例

    php+redis简单实例 一.说明 因为redis是c/s架构.从这个角度上.不论什么符合redis的client要求的.都能够与redis进行通讯.官方提供了非常多的client. php在web ...

  9. MySQL高级查询 & 事务机制

    1.基础查询where 高级条件查询Where子句 SELECT empno,ename,sal,hiredate FROM t_tmp WHERE deptno=10 AND (sal+IFNULL ...

随机推荐

  1. Redis数据类型--List

    Redis列表是简单的字符串列表,依照插入顺序排序. 你能够加入一个元素到列表的头部(左边)或者尾部(右边) LPUSH 命令插入一个新的元素到头部, RPUSH插入一个新元素到尾部. 当一个这两个操 ...

  2. Oracle spatial抽稀函数(SDO_UTIL.SIMPLIFY)

    在使用Oracle spatial做空间查询和展示时,经常会遇到展示或者查询过慢,这时候我可以通过空间数据抽稀来优化查询展示效率. 在Oracle spatial中的抽稀函数为:SDO_UTIL.SI ...

  3. android-关于友盟的自动版本更新(面向小白)

    今天说一下关于友盟的自动版本更新(傻瓜式版本更新) 关于自动更新的话,如果让android程序猿自己写的话还是不是那么简单的(对于我这个菜鸟来说...),又要检查当前版本,又要在服务器存储新的版本,又 ...

  4. [Linux]vbox 虚拟机加入新磁盘

    情况是这种,開始创建虚拟机的时候硬盘设置太小了.仅仅有10g,我如今通过vbox的设置给这个linux(centos6.6)虚拟机加入了一块硬盘. 以下的操作就是怎么把硬盘挂载到系统中. 通过 fdi ...

  5. 【Cocos2d-x 3.0】游戏开发之android交叉编译

    作者:Senlern 转载请注明,原文链接:http://blog.csdn.net/zhang429350061/article/details/37959489 在上一篇文章我分享了如在win32 ...

  6. DB2删除重复数据

    有时候DB2建表时不设置主键,就可能存在脏数据,例如:两条一样数据重复存在,这时候就需要将重复记录删除,然后留下一条记录. )); ----插入重复数据 ,'jack'); 插入数据后,结果如下图: ...

  7. linux shell 总结

    .#!指定执行脚本的shell 如果不写的话,用系统默认的shell s shell是所有linux ,unix都支持的 .#开始的行表示注释(不限于行首) 命令建议写绝对路径 执行: ./examp ...

  8. Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

    setup slave from backup i got error Got fatal error 1236 from master when reading data from binary l ...

  9. C#:向SqlServer数据库中插入imange类型

    using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServi ...

  10. 04-树7. Search in a Binary Search Tree (25)

    04-树7. Search in a Binary Search Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 ...