Redis之Transactions(事物)
你问我Redis支不支持事物?告诉你,Redis对事物的支持是部分支持(对比关系型数据库,没有强一致性)
定义:一个队列、一次性、顺序的、排他性的执行一系列命令
常用命令:
DISCARD 取消事物,放弃执行事物块内的所有命令
EXEC 执行事物块内的所有命令
MULTI 标记一个事物块的开始
UNWATCH 取消watch命令对所有key的监控
WATCH 监控一个或多个key,如果在事物执行之前,key被其他命令改动,那么事物将被打断
Case1:正常执行

Case2:放弃事物

我们可以发现,k1还是Case1中设置的值
Case3:全体连坐(一个捣蛋,全体都死)

Case4:冤头债主(错误的不执行,正确的照常执行)

k1位字符型,增加1显然不行,但是语法没错(加入了队列,不像Case3中的直接报错)。执行EXEC时,出现错误的语句块不会执行成功,但不影响事物块中其他的命令执行
Case5:watch监控
⑴ 第一步:(balance 可用余额,debt:欠款),假设我买了个包子20块刷了我的信用卡,可用余额减20,欠款加20

⑵ 第二步(当第一个窗口watch[监控]balance的后,在第二个窗口将balance设置成了1000块,然后我在第一个窗口又买了个包子花了20块,执行事物发现,并没有成功,获得最新的balance为1000):

上面这部类似于数据库中的乐观锁,当我们修改一条记录的时候,别人也在试图修改这条记录,当别人先于我之前就提交了,那么我提交的时候,就不能覆盖别人提交的数据,所以rollback了。
⑶ 第三步(第一个窗口watch[监控]我的余额后,在第二个窗口修改余额,假设此时我知道有人改了我的余额,那我在第一个窗口Unwatch一下,然后再watch下,设置我的余额为100,欠款为0,执行成功):

小结:WATCH监控一个或多个key,如果在事物执行之前,key被其他命令改动,那么事物将被打断(事物队列都不会被执行)
一旦执行了exec,之前加的监控锁都会被取消
如果是watch多个key,倘若watch之后有人改动过其中的key,exec执行的事物将都被放弃,同时返回NullMulti-bulk应答以通知调用者事物执行失败
Redis之Transactions(事物)的更多相关文章
- Springboot与ActiveMQ、Solr、Redis中分布式事物的初步探索
Springboot与ActiveMQ.Solr.Redis中分布式事物的初步探索 解决的场景:事物中的异步问题,当要求数据库与solr服务器的最终一致时. 程序条件: 利用消息队列,当数据库添加成功 ...
- Redis集群事物提交异常Multi-key operations must involve a single slot
redis做完集群后不同键在同一事物中提交,因为key的hash计算结果不同不能分配到同一个分片上,因此出现此异常. 解决方案:在本次事物的key内添加"{tag}",这时redi ...
- Redis 命令 - Transactions
DISCARD Discard all commands issued after MULTI 127.0.0.1:6379> MGET bank:A:account bank:B:accoun ...
- Redis常用数据类型和事物以及并发
Redis数据类型 基本类型(String int): 如 set key value .get key 等 所有命令都是按照 key value keys * 可以将全部数据列出,其中后面的 &qu ...
- Redis事物及锁的运用
redis与mysql事物比较如下: 下面是一个redis事物运用于买票的demo
- Redis应用场景-转载
1. MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的 ...
- Redis学习笔记--五种数据类型的使用场景
String 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- Redis基础知识之—— 缓存应用场景
转载原文:http://www.cnblogs.com/jinshengzhi/articles/5225718.html 一.MySql+Memcached架构的问题 Memcached采用客户端- ...
- <转>Redis 应用场景
http://blog.csdn.net/hguisu/article/details/8836819 1. MySql+Memcached 架构的问题 Memcached采用客户端-服务器的架构, ...
随机推荐
- 微信小程序——引入背景图片【六】
前言 之前写了一些小程序的博文只是看文档边看边写,了解下他,这次可是真枪真刀的做了! 框架使用的是美团的mpvue,我也是一边学习,一边写的,如有错误之处,还望大家指出. 在这里我有个问题,为什么微信 ...
- Django+Xadmin打造在线教育系统(八)
首页和全局404,500配置 轮播图 公开课 授课机构 新建view ## 首页view class IndexView(View): def get(self,request): # 取出轮播图 a ...
- POJ 3074 Sudoku(算竞进阶习题)
二进制优化+dfs 话说这题数据中真的丧心病狂..不加inline还过不去.. 因为不会DLX只好用二进制来优化了...万万没想到还是低空飘过 我们在行.列.格分别用一个9位二进制常数来记录什么数能放 ...
- Codeforces543 B. Destroying Roads
传送门:>Here< 题意:给出一张无向图(边权为1),并给出两对起点和终点以及距离:s1,t1,l1; s2,t2,l2; 要求删除尽量多的边,使得dis(s1,t1)<=l1, ...
- 【XSY2741】网格 分治 LCT 并查集
题目描述 有一个\(n\times m\)的网格,线框的交点可以扭动,边不可伸缩.网格中有一些格子里面放了'x'形的支架,这些格子不会变形,但可以整体转动.如果所有格子都不能变形,那么称这个网格稳固. ...
- 【XSY2111】Chef and Churus 分块 树状数组
题目描述 有一个长度为\(n\)的数组\(A\)和\(n\)个区间\([l_i,r_i]\),有\(q\)次操作: \(1~x~y\):把\(a_x\)改成\(y\) \(2~x~y\):求第\(l\ ...
- MT【189】二次条件配方
“当一幢建筑物完成时,应该把脚手架拆除干净.”——高斯 (2017北大特优)若对任意使得关于 \(x\) 的方程 \(ax^2+bx+c=0\)(\(ac\ne 0\))有实数解的 \(a,b,c\) ...
- 「SDOI2014」Lis 解题报告
「SDOI2014」Lis 题目描述 给定序列 \(A\),序列中的每一项 \(A_i\) 有删除代价 \(B_i\) 和附加属性 \(C_i\). 请删除若干项,使得 \(A\) 的最长上升子序列长 ...
- python装饰器中的计时器thd.strat用法
thd = KThread(target=_new_func, args=(), kwargs=new_kwargs) thd.start() thd.join(seconds) alive = th ...
- pandas 轮询dataframe
轮询有一个挺好的方式,df.iterrows() 这个函数同时返回 索引和行对象的生成器可以直接进行遍历. import pandas as pd df = pd.read_csv("dru ...