redis05----Redis 中的事务
Redis支持简单的事务
Redis与 mysql事务的对比
Mysql |
Redis |
|
开启 |
start transaction |
multi |
语句 |
普通sql |
普通命令 |
失败 |
rollback 回滚 |
discard 取消(不叫回滚,是队列里面的命令不执行,队列里面的任务根本就没有执行。而不是执行了也可以撤回来) |
成功 |
commit |
exec |
注: rollback与discard 的区别
如果已经成功执行了2条语句, 第3条语句出错.
Rollback后,前2条的语句影响消失.
Discard只是结束本次事务,前2条语句造成的影响仍然还在。严格来讲不叫回滚,只是叫取消。Redis的事务相对要简单。
r1:2>set wang 100
"OK" r1:2>set zhao 100
"OK" r1:2>multi
"OK" r1:2>decrby zhao 100
"QUEUED" //减100并没有执行,而是加入到了队列中,redis是单进程的,exec的时候就回去执行队列里面的语句 r1:2>incrby wang 100
"QUEUED"
r1:2>get wang
"QUEUED" r1:2>get zhao
"QUEUED"
r1:2>exec
注:
在mutil后面的语句中, 语句出错可能有2种情况
1: 语法就有问题,
这种,exec时,报错, 所有语句得不到执行
r1:2>multi
"OK" r1:2>decrby zhao 100
"QUEUED" r1:2>sdsv
"ERR unknown command 'sdsv'" r1:2>exec
"EXECABORT Transaction discarded because of previous errors." //事务取消了,zhao没有减100 2: 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象
Exec之后,会执行正确的语句,并跳过有不适当的语句.
r1:2>multi
"OK" r1:2>decrby zhao 100
"QUEUED" r1:2>sadd wang pig //wang是一个字符串,这里当成是集合在处理
"QUEUED" //放在队列里面,命令尚没有执行,
r1:2>exec
1) "0" //zhao的钱变为了0
2) "WRONGTYPE Operation against a key holding the wrong kind of value" //第二个语句执行出错 (如果zadd操作list这种事怎么避免? 这一点,由程序员负责)
Multi是把命令放在一个队列里面,exec是真正的执行,语法错误则都不执行,语法没错但是适用对象有错则执行正确的语句跳过错误的语句。这就没法保证原子性。 r1:2>multi
"OK" r1:2>decrby zhao 100
"QUEUED" r1:2>decrby wang 100
"QUEUED" r1:2>discard //取消,就是清空队列,就不会执行了
"OK"
r1:2>mget zhao wang
1) "100"
2) "100"
思考:
我正在买票
Ticket -1 , money -100
而票只有1张, 如果在我multi之后,和exec之前, 票被别人买了---即ticket变成0了.
我该如何观察这种情景,并不再提交 悲观的想法:
世界充满危险,肯定有人和我抢, 给 ticket上锁, 只有我能操作. [悲观锁] 乐观的想法:
没有那么人和我抢,因此,我只需要注意,
--有没有人更改ticket的值就可以了 [乐观锁] Redis的事务中,启用的是乐观锁,只负责监测key没有被改动. 具体的命令---- watch命令
例:
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
//现在已经对ticket进行了监控,另外一个窗口将ticket改动了
另一个窗口:> decr ticket
redis 127.0.0.1:6379> exec
(nil) // 返回nil,说明监视的ticket已经改动了,事务就取消了.队列就不执行了。
redis 127.0.0.1:6379>mget ticket money
"0"
"200" watch key1 key2 ... keyN
作用:监听key1 key2..keyN有没有变化,如果任意一个有变, 则事务取消
unwatch
作用: 取消所有watch监听
redis05----Redis 中的事务的更多相关文章
- Redis系列之key操作命令与Redis中的事务详解(六)
序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...
- redis中的事务
首先明白在java中线程和进程的区别: 1.什么是多线程? 是指一个应用程序同时执行多个任务,一般来说一个任务就是一个线程 ,而一个应用程序有一个以上的线程我们称之为多线程. 2.什么是进程? 进程是 ...
- redis中的事务(版本2.6.16)
一.命令支持 1.multi 开始事务 2.exec事务提交 3.取消事务discard 二.事务示例 1.示例 redis>set key1 20OKredis>mutilOKredis ...
- Redis中的事务及乐观锁的实现
介绍 Redis中的事务(transaction)是一组命令的集合. 事务同命令一样都是Redis最小的执行单位,一个事务中的命令要么都执行,要么都不执行. Redis事务的实现需要用 ...
- 如何在Redis中实现事务
如何在Redis中实现事务 - 微店技术团队 - SegmentFault 思否 https://segmentfault.com/a/1190000007429197
- Redis 中的事务分析,Redis 中的事务可以满足ACID属性吗?
Redis 中的事务 什么是事务 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(Isolation) 4.持久性(Durability) 分析下 Redis 中的 ...
- Redis 中的事务
Redis支持简单的事务 Redis与mysql事务的对比 Mysql Redis 开启 start transaction muitl 语句 普通sql 普通命令 失败 rollback 回滚 di ...
- Redis中的事务(多命令)操作
作为一个nosql数据库,事务是必要功能.但是redis我们是可以理解为它不支持事务操作的,因为它的特征完全不满足我们对事物的正常理解 ps:我不知道是谁一开始提出redis支持事务的,但是我更倾向于 ...
- 【记录一个问题】redis中执行事务出现错误“EXECABORT Transaction discarded because of previous errors”
执行事务的大致代码如下: redisClient := GetRedisClient() pipe := redisClient.TxPipeline() err := pipe.ZAdd(k, ar ...
- redis中的事务、lua脚本和管道的使用场景
参考文章 : https://blog.csdn.net/fangjian1204/article/details/50585080
随机推荐
- leetcode 347 priority,map的使用
主要是对次数进行排序,然后去前几个最大次数的值,输出即可 class Solution { public: vector<int> topKFrequent(vector<int&g ...
- 请问 内网的 dns服务器 为什么和 外网的dns服务器 一样??
公司内的内网使用192.169.X.X的内网地址,但是在DNS段填写的是210.34.X.X,显然这是一个公网固定IP,我不明白的是:为什么内部网客户端使用的DNS服务器是公网上的IP呢?内网客户端能 ...
- Linux(13):期中架构(5)--- 前端部分:keepalived高可用 & HTTPS & iptables防火墙
keepalived 高可用集群 1. keepalived服务概念说明 # 1.1 keepalived软件的作用? Keepalived软件起初是专为LVS负载均衡软件设计的, 用来管理并监控LV ...
- 玩转css样式选择器----当父元素只有一个子元素时居中显示,多个水平排列
- android自定义Activity窗体大小
先给大家看图吧: 看,是不是很酷呢,呵呵. 这里我说关键的地方,就是自定义Activity的窗体大小. 这个登录框它不是一个Dialog,而是一个Activity. 如何定义,即把Activity的主 ...
- hdu4862 2014多校B题/ 费用流(最优情况下用不大于K条路径覆盖)(不同的解法)
题意: 一个数字矩阵,可以出发K次,每次可以从右边或者下面走,要求(在收益最大情况下)覆盖全图,不能则输出-1.(规则:每次跳一步的时候若格子数字相等则获得该数字的能量,每跳一步消耗距离的能量).每个 ...
- 1861 奶牛的数字游戏 2006年USACO
codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Descript ...
- SpringBoot整合freemarker中自定义标签获取字典表的数据
因为在前端要根据字典表中的数据去将1.2这些值转换成对应的文字解释 1.首先要创建一个类去实现 TemplateDirectiveModel 类 @Component public class Dic ...
- JSONKit升级XCODE后报一堆警告解决办法
虽然我已经该用apple自己的json解析了,但是对于需要兼容低版本的,还是需要用第三方的, 目前用的最多的就有JSONKit了,包括微博sdk,但是一编译报一堆警告,看着很不爽.可以自己手动一个个修 ...
- 解密优秀博士成长史 ——微软亚洲研究院首届博士生学术论坛Panel讨论经验总结
编者按:有人说“一入博门深似海”,读博前应该做好哪些准备?作为一名博士生,应该有怎样的学术或职业规划?导师还是老板?怎样在师生关系上做到双赢?你是导师心目中优秀的博士生吗?相信以上问题在很多同学心中萦 ...