四. Redis事务处理
Redis目前对事务的支持还是比较简单,Redis能保证一个Client发起的事务中的命令可以连续执行,而中间不会插入其他Client的命令;当一个Client在连接中发起一个multi命令的时候,这个连接会进入事务上下文,而连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令的时候,redis会顺序的执行该队列中的所有命令。
Redis事务涉及的命令关键字:MULTI 进入一个事务上下文,EXEC 执行事务 ,DISCARD 回滚事务 , Watch 事务乐观锁
在SQLServer 或 Mysql 当中的事务(当事务中操作出现错误的时候,会完全回滚事务)。但是在 Redis 中会有些不一样。
可以从下面命令执行过程中看到:
127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> set name hexu
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> exec
1) (integer) 11
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get age
"11"
127.0.0.1:6379> get name
"hexu"
key["age"]是一个int,key["name"]是一个字符串,当我们通过incr命令递增age和name的时候,name出现错误,最后我们执行exec命令,age的结果没有回滚。这就redis需要改进的地方。
事务乐观锁
watch 命令会监视给定的key ,当exec时候,如果监视的key发生过变化,则整个事务失败。
当有多个Session时,Seesion1 首先开启事务,对 age 赋值为 100,此时事务暂时未被Exec。Session2使用非事务方式对 age 赋值为 120,赋值完成。然后 Session1执行 Exec命令。当一个key被加上乐观锁的时候,该事务会执行失败。
Session1:
127.0.0.1:6379> WATCH age 第一步
OK
127.0.0.1:6379> MULTI 第二步
OK
127.0.0.1:6379> set age 100 第三步
QUEUED
127.0.0.1:6379> EXEC 第五步
(nil)
Session2:
127.0.0.1:6379> set age 120 第四步
OK
使用 EXEC,DiSCARD,UNWATCH 命令都会清除连接中的监视
四. Redis事务处理的更多相关文章
- Redis系列四 Redis常见配置
redis.conf常见配置 参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no2. ...
- Redis 详解 (四) redis的底层数据结构
目录 1.演示数据类型的实现 2.简单动态字符串 3.链表 4.字典 5.跳跃表 6.整数集合 7.压缩列表 8.总结 上一篇博客我们介绍了 redis的五大数据类型详细用法,但是在 Redis 中, ...
- redis(四)redis与Mybatis的无缝整合让MyBatis透明的管理缓存
redis的安装 http://liuyieyer.iteye.com/blog/2078093 redis的主从高可用 http://liuyieyer.iteye.com/blog/207809 ...
- 四.redis 事务
redis对事务的支持目前还比较简单.redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令. 由于redis是单线程来处理所有client的请求的所 ...
- Redis基础学习(四)—Redis的持久化
一.概述 Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方 ...
- redis在游戏服务器中的使用初探(四) redis应用
文章系列先介绍环境搭建 介绍redis操作和代码编写运行 这是典型的实战工程过程.那么我们为何要使用redis而不是常规的数据库比如 mysql呢? 因为KV内存数据库最大的优势所有数据全部存储在内 ...
- 【Redis】5、Redis事务处理
MULTI .EXEC .DISCARD 和WATCH 是 Redis 事务的基础 1.MULTI 命令用于开启一个事务,它总是返回 OK .MULTI 执行之后,客户端可以继续向服务器发送任意多条 ...
- spring boot 自学笔记(四) Redis集成—Jedis
上一篇笔记Reddis集成,操作Redis使用的是RedisTemplate,但实际中还是有一大部分人习惯使用JedisPool和Jedis来操作Redis, 下面使用Jedis集成示例. 修改Red ...
- Redis学习总结(四)--Redis主从配置
在分布式系统架构设计中高可用是必须考虑的因素之一.高可用通常是指,通过设计减少系统不能提供服务的时间.而单点是系统高可用的最大的败笔,如果单点出现问题的话,那么整个服务就不能使用了,所以应该尽量在系统 ...
随机推荐
- CMake设置编译参数
项目中的CMake编译参数一直参照Muduo进行设置. Muduo的CMakeLists.txt中,MAKE_CXX_FLAGS设置较为清晰明了,因此一直在项目中沿用. set(CXX_FLAGS - ...
- [源码]Python简易http服务器(内网渗透大文件传输含下载命令)
Python简易http服务器源码 import SimpleHTTPServerimport SocketServerimport sysPORT = 80if len(sys.argv) != 2 ...
- maven配置阿里云中央仓库
首先查看下maven安装位置下的/conf/settings.xml的路径,如下图我这里是D:\Java\apache-maven-3.3.9\conf\settings.xml 然后根据路径找到配置 ...
- NuGet 构建服务器与常用命令
公司出于某些原因需要自己在内部网络搭建一个私有的 Nuget 服务器,而且要运行在 Linux服务器上面.如果说 Windows 下搭建的话很简单,直接在项目当中引入 Nuget 的库就 OK,这儿的 ...
- Apache-Flink深度解析-概述
摘要: Apache Flink 的命脉 "命脉" 即生命与血脉,常喻极为重要的事物.系列的首篇,首篇的首段不聊Apache Flink的历史,不聊Apache Flink的架构, ...
- mcrypt加密以及解密过程
Mcrypt库支持20多种加密算法和8种加密模式,具体可以通过函数mcrypt_list_algorithms()和mcrypt_list_modes()来显示 Mcrypt扩展库可以实现加密解密功能 ...
- python等值和大小比较
等值.大小比较 在python中,只要两个对象的类型相同,且它们是内置类型(字典除外),那么这两个对象就能进行比较.关键词:内置类型.同类型.所以,两个对象如果类型不同,就没法比较,比如数值类型的数值 ...
- Flask入门第一天
一.flask介绍 flask诞生于2010年,是Armin ronacher用python语言基于Werkzeug工具箱编写的轻量级web开发框架.flask本身相当于一个内核,其他所有的功能都需要 ...
- [转]如何将高版本的SQL Server数据库备份到低版本的SQL Server
本文转自:https://blog.csdn.net/wang465745776/article/details/54969676 前提条件备份SQL Server服务器版本为:12.0.2000.8 ...
- WPF 水平进度条
WPF设计界面过程中,有时需要设计一种可以手动滑动修改并实时显示的进度条 进度条,效果如下: 颜色.图标.节点什么的,都可以重新替换. 前端XAML代码: <UserControl x:Clas ...