博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis事务
阅读量:5049 次
发布时间:2019-06-12

本文共 2106 字,大约阅读时间需要 7 分钟。

核心知识点:

1.事务出错的类型有两种:

a.语法错误,事务不会被执行;

b.运行时报错,可能有部分事务会被执行成功。

2.watch可以监测在执行事务的过程中,如果目标被改变,将会导致事务无法执行。

 

熟悉关系型数据库的读者应该对事务比较了解,简单的说,事务表示一组动作,要么全部执行,要么全部不执行。

Redis提供了简单的事务功能,将一组需要执行的命令放到multi和exec两个命令之间。

multi命令代表事务开始,exec命令代表事务结束,它们之间的命令是原子顺序执行的。

例如,如果两个人需要成为好友,需要各自在自己的好友列表中加上对方的命令,如果只完成了一方,那么这组命令应该视作无效。

127.0.0.1:6379> multiOK127.0.0.1:6379> sadd kebi:friend maoxianQUEUED127.0.0.1:6379> sadd maoxian:friend kebiQUEUED

可以看到sadd命令此时的返回结果是QUEUED,代表命令并没有真正执行,而是暂时保存在Redis中。

在另外一个客户端查看刚才的添加操作,应该没有结果:

127.0.0.1:6379> sismember maoxian:friend kebi(integer) 0

只有执行了exec之后,写入操作才算完成。

127.0.0.1:6379> exec1) (integer) 12) (integer) 1

再次在另外一个客户端查询,有结果:

127.0.0.1:6379> sismember maoxian:friend kebi(integer) 1

如果事务中命令出现错误,Redis的处理机制也不尽相同,一般主要有两种情况。

1.命令错误

如果事务的执行过程中,出现语法错误,会造成整个事务无法执行:

127.0.0.1:6379> multiOK127.0.0.1:6379> sadd kebi:friend maoxianQUEUED127.0.0.1:6379> saddd maoxian:friend kebi(error) ERR unknown command 'saddd'127.0.0.1:6379> exec(error) EXECABORT Transaction discarded because of previous errors.127.0.0.1:6379> sismember kebi:friend maoxian(integer) 0   #并没有添加成功

 

2.运行时错误

也许语法不存在问题,但是执行过程中出现了错误,这种情况可能导致部分操作被执行成功。

(integer) 1127.0.0.1:6379> multiOK127.0.0.1:6379> sadd kebi:friend xiaoniaoQUEUED127.0.0.1:6379> zadd maoxian:friend 1 xiaoniaoQUEUED  #并没有语法错误,可maoxian:friend是集合,不是有序集合127.0.0.1:6379> exec1) (integer) 12) (error) WRONGTYPE Operation against a key holding the wrong kind of value127.0.0.1:6379> sismember kebi:friend xiaoniao(integer) 1127.0.0.1:6379> sismember maoxian:friend xiaoniao(integer) 0

可以看到错误只是部分,但是并不是所有结果都没有执行,这就会导致问题。

Redis并不支持回滚功能,开发人员需要自己修复这类问题。

有些应用场景在事务之前,确保事务中的key没有被其他客户端修改过,才执行事务,否则不执行。Redis提供了watch命令来解决这类问题。

#客户端1127.0.0.1:6379> set key javaOK#客户端1127.0.0.1:6379> watch keyOK#客户端1127.0.0.1:6379> multiOK#客户端2127.0.0.1:6379> append key python(integer) 10#客户端1127.0.0.1:6379> append key linuxQUEUED#客户端1127.0.0.1:6379> exec(nil)#客户端1127.0.0.1:6379> get key"javapython"

可以看到,如果在执行exec之前,所需的数据被修改了将会导致事务不能被执行。

Redis提供了简单的事务功能,之所说它简单,主要是因为它不支持事务中的回滚特性,

同时无法实现命令之间的逻辑关系计算,当然也体现了Redis的“keep it simple”的特性。

转载于:https://www.cnblogs.com/yangmingxianshen/p/8098996.html

你可能感兴趣的文章
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
apache服务器中设置目录不可访问
查看>>
嵌入式Linux驱动学习之路(十)字符设备驱动-my_led
查看>>
【NOIP模拟】密码
查看>>
java容器---------手工实现Linkedlist 链表
查看>>
three.js 性能优化的几种方法
查看>>
《梦断代码》读书笔记(三)
查看>>
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>
Codeforces 450 C. Jzzhu and Chocolate
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&&打表)
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>