`
zc985552943
  • 浏览: 287372 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Babe4ca6-5e6f-33aa-9078-762ee3ccfb7e
云计算--hadoop
浏览量:11490
5e98c2c1-2a82-3388-bc80-7fca0170bb12
redis解说
浏览量:26651
088014c7-4d3f-39ce-b72e-4ebe7046a134
MongoDB读书笔记
浏览量:15634
D2b74847-c860-3e26-96fe-3fa4498d6348
Maven读书笔记
浏览量:26695
688db20f-402d-3a1d-8188-d6153d6c7465
Java通信
浏览量:13406
社区版块
存档分类
最新评论

05_Redis_事务

阅读更多

1.redis事务的概念

redis事务可以一次性执行多个命令,有两个重要的特性:

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

2.redis事务的用法

redis实现事务控制有5个命令。这5个命令是事务的基础。

A.discard:取消事务,放弃执行事务块内的所有命令。
B.exec:执行所有事务块内的命令。
C.multi:标记一个事务块的开始。
D.unwatch:取消 WATCH 命令对所有 key 的监视。
E.watch:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

3.redis事务样例:

实例一:下面是一个最简单的事务方式

redis 127.0.0.1:6379> multi   //开启事务
OK
redis 127.0.0.1:6379> incr a  //事务中的命令
QUEUED
redis 127.0.0.1:6379> incr b
QUEUED
redis 127.0.0.1:6379> incr a
QUEUED
redis 127.0.0.1:6379> exec  //执行事务
1) (integer) 1  //返回的结果
2) (integer) 1
3) (integer) 2
redis 127.0.0.1:6379> 

 

说明:当客户端处于事务状态时, 所有传入的命令都会返回一个内容为 QUEUED 的状态回复(status reply), 这些被入队的命令将在 EXEC 命令被调用时执行。这些命令在客户端中以队列的形式排好队。

实例二:开启两个客户端,在两个事务中同时访问一个变量

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr a
QUEUED
redis 127.0.0.1:6379> incr b
QUEUED
redis 127.0.0.1:6379> exec
1) (integer) 4
2) (integer) 3
redis 127.0.0.1:6379> 

 

redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> incr a
QUEUED
redis 127.0.0.1:6379> incr b
QUEUED
redis 127.0.0.1:6379> exec
1) (integer) 3
2) (integer) 2
redis 127.0.0.1:6379> 

 

说明:事务2优先与实务1,但是两个事务相互没有影响。这说明,我们开启事务后,所有要执行的命令都是在客户端的队列中。只有提交时,才在服务器端一次性,有顺序的执行。

4.redis事务中的错误

  • 事务在执行 EXEC 之前,入队的命令可能会出错。比如说,命令可能会产生语法错误(参数数量错误,参数名错误,等等),或者其他更严重的错误,比如内存不足(如果服务器使用 maxmemory 设置了最大内存限制的话)。
  • 命令可能在 EXEC 调用之后失败。举个例子,事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面,诸如此类。

说明:对于exec之前的错误,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。

在 EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理:即使事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍然会继续执行

下面举两个例子:

redis 127.0.0.1:6379> get a  //首先查看a的值:4
"4"
redis 127.0.0.1:6379> multi  //开启事务
OK
redis 127.0.0.1:6379> incr a  //将a递增1
QUEUED
redis 127.0.0.1:6379> incr c i k  //错误的语法,在exec之前的错误
(error) ERR wrong number of arguments for 'incr' command
redis 127.0.0.1:6379> exec  //提交事务
(error) EXECABORT Transaction discarded because of previous errors.
redis 127.0.0.1:6379> get a  //继续查看a的值:4
"4"   //结论说明,事务没有被执行
redis 127.0.0.1:6379> 

 

redis 127.0.0.1:6379> multi  //开启事务
OK
redis 127.0.0.1:6379> set aa abc  //设置aa的值为:abc
QUEUED
redis 127.0.0.1:6379> lpop aa  //没有语法错误
QUEUED
redis 127.0.0.1:6379> exec  //执行事务
1) OK
2) (error) ERR Operation against a key holding the wrong kind of value
redis 127.0.0.1:6379> get aa  //aa的值仍然存在
"abc"  //结果说明,exec之后的错误,redis是不作处理的,即:没有回滚事务
redis 127.0.0.1:6379> 

 5.redis为什么没有回滚事务

在redis官方文档中描述两点:

  1. Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
  2. 因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。

6.redis放弃事务

redis 127.0.0.1:6379> set aa hadoop
OK
redis 127.0.0.1:6379> get aa
"hadoop"
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> set aa hive
QUEUED
redis 127.0.0.1:6379> DISCARD
OK
redis 127.0.0.1:6379> get aa
"hadoop"
redis 127.0.0.1:6379>

 7.锁watch

WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC 返回空多条批量回复(null multi-bulk reply)来表示事务已经失败。

//客户端1
redis 127.0.0.1:6379> get aa  //首先查看aa的值
"hadoop"
redis 127.0.0.1:6379> WATCH aa  //添加乐观锁
OK
redis 127.0.0.1:6379> multi  //开启事务
OK
redis 127.0.0.1:6379> set aa hive  //重新设置aa的值
QUEUED
redis 127.0.0.1:6379> exec  //在提交之前先在客户端2中重新设置aa的值
(nil)  //提交完后,返回nil
redis 127.0.0.1:6379> get aa  //重新查看,说明事务被取消了
"hbase"
//客户端2
redis 127.0.0.1:6379> set aa hbase  //在客户端2中设置aa的值为hbase
OK
redis 127.0.0.1:6379> get aa  //查看aa的值
"hbase"

 

分享到:
评论

相关推荐

    尚硅谷_Redis.docx

    在本课程中,你将了解Redis是什么、能干什么、如何用,了解NoSQL的使用场景和概念,快速掌握Redis的安装配置、五大数据类型、常用操作命令、Redis持久化、主从复制、事务控制以及用Jedis操作进行Java开发等知识。...

    Redis操作命令中文版API_redis_rediscommandapi_detail66w_API_

    本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版:所有 Redis 命令文档均已翻译完毕, Redis 最重要的一部分主题(topic)文档,比如事务、持久化、复制、Sentinel、集群等文章也已翻译完毕...

    Redis入门到精通视频教程

    视频详细讲解,需要的小伙伴自行百度网盘下载,链接...05_linux环境安装redis 06_redis 持久化 07_redis 事务 08_删除策略 09_redis服务器配置 10_高级数据类型 11_主从复制 12_哨兵模式 13_cluster 14_企业级解决方案

    JAVA WEB_redis_javaweb_httpjsp_javaweb新手入门_tomcat_

    一、 JavaScript二、 数据库单表三、 数据库多表四、 事务的管理五、 JDBC六、 JDBC连接池七、 DBUtils八、 Tomcat & Http九、 Servlet & request & response十、 JSP & EL十一、 Cookie & ...

    springboot-redis事务

    springboot-redis事务

    08-Redis HyperLogLog与事务和Redis 7.0那点事-ev.rar

    08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar08-Redis HyperLogLog与事务和Redis 7.0那点事_ev.rar...

    cpp-predixy一款高性能全特征redis代理支持redissentinel和rediscluster

    predixy是一款高性能、全特性的redis代理,性能之高超越所有其它同类...redis全特性支持,无论是redis cluster还是redis sentinel都不在话下,更不用说redis自身的阻塞式命令、多key命令、事务、发布订阅、脚本等。

    redis事务回滚工具

    基于SpringBoot的轻量级redis事务回滚机制,使用栈和ThreadLocal记录业务链的redis操作,发生异常进行回滚,参考了阿里巴巴Seata AT模式的db回滚策略:补偿回滚,记录前镜像与当前操作语句,反向解析生成补偿动作。...

    redis_事务_.mp4

    Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令

    redis_事务_.pptx

    Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令

    记录redisson实现redis分布式事务锁

    自己封装redisson方法,同时通过注解的方式加入redis分布式事务锁,可靠。

    redis事务与关系型数据库事务比较

    文档列举了redis环境的事务与关系型数据库的事务的区别

    Cm_Cache_Backend_Redis:Redis的Zend_Cache后端,完全支持标签(与Magento配合使用)

    使用Redis的Zend_Cache后端,全面支持标签此Zend_Cache后端允许您将Redis服务器用作中央缓存存储。 完全支持标签,而无需使用TwoLevels缓存,因此该后端非常适合在单台... 使用事务来防止保存,清除或删除之间的争用

    redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用

    基于北京尚硅谷周阳老师讲解的redis。个人学习总结: 包含redis常用命令,redis配置文件,redis持久化,redis事务,redis主从复制,jedis的使用。

    cpp-Redis分布式事务

    在大型游戏中经常使用分布式,分布式中因为游戏逻辑会经常游戏事务,借助redis某些特性我们可以实现分布式锁和分布式事务。

    cache_redis_node:在Redis,Mongo和Node.js中使用Cache的示例

    当前,Node.js中有多个API可以处理大量事务,在关系和非关系数据库中进行查询,磁盘访问,旧版服务甚至其他API。如果结构规划不当,将来可能会产生技术债务,因此需要更改体系结构以提高应用程序的性能。 其他时候,...

    【Redis缓存机制】详解Java连接Redis_Jedis_事务

    主要介绍了【Redis缓存机制】详解Java连接Redis_Jedis_事务,详细的介绍了Jedis事务和实例,有兴趣的可以了解一下。

    Redis面试题50道(含答案)_.pdf

    27、Redis 事务相关的命令有哪几个? 28、Redis key 的过期时间和永久有效分别怎么设置? 29、Redis 如何做内存优化? 30、Redis 回收进程如何工作的? 31、Redis 回收使用的是什么算法? 32、Redis 如何做大量数据...

    Redis事务的使用

    一、Redis事务简介 Redis事务可以一次执行多个命令,一个事务的所有命令都会序列化并按顺序地串行化执行,而不会被其他客户端提交的命令请求插入到事务执行命令序列中。 二、Redis事务命令 下面的表格节选自:...

Global site tag (gtag.js) - Google Analytics