四. 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 命令都会清除连接中的监视

时间: 2024-10-15 01:23:03

四. Redis事务处理的相关文章

redis事务处理

当前使用的redis版本 #redis-cli -v redis-cli 2.6.4 MULTI .EXEC .DISCARD 和WATCH 是 Redis 事务的基础 1.MULTI  命令用于开启一个事务,它总是返回 OK . MULTI 执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中 2.EXEC 命令被调用时,所有队列中的命令才会被执行. +++++++++++命令 +++++++++++ redis 192.168.1.53:6379>

Redis系列四 Redis常见配置

redis.conf常见配置 参数说明redis.conf 配置项说明如下:1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程  daemonize no2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定  pidfile /var/run/redis.pid3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为

Redis基础学习(四)—Redis的持久化

一.概述      Redis的强大性能很大程度上都是因为数据时存在内存中的,然而当Redis重启时,所有存储在内存中的数据将会丢失,所以我们要将内存中的数据持久化. Redis支持两种数据持久化的方式: RDB方式和AOF方式. (1)RDB方式会根据配置的规则定时的将内存中的数据持久化到硬盘上. (2)AOF则是在每次执行写命令之后将命令记录下来.   1.RDB方式      RDB方式的持久化是通过快照的方式完成的.当符合某种规则时,会将内存中的数据全部生成一个副本存储在硬盘上,Redi

redis 事务处理

redis对事务的处理目前还非常简单,Redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令,当一个client在一个连接中发出multi命令的时候,这个连接会进入一个事务上下文,该连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序执行队列中的所有命令. multi 标记一个事务块的开始. set name zhangdh set age 30 exec  提交 multi incr age incr nam

深入剖析Redis系列(四) - Redis数据结构与全局命令概述

前言 Redis 提供了 5 种数据结构.理解每种数据结构的特点,对于 Redis 的 开发运维 非常重要,同时掌握 Redis 的 单线程命令处理 机制,会使 数据结构 和 命令 的选择事半功倍. 接下来的几篇文章,将从如下几个方面介绍 Redis 的几种数据结构,命令使用及其应用场景. 预备知识:几个简单的 全局命令,数据结构 和 内部编码,单线程命令 处理机制分析. 数据结构特性:5 种 数据结构 的特点.命令使用.应用场景. 数据管理:键管理.遍历键.数据库管理. 正文 1. 预备知识

二十四 Redis

Redis数据类型: Redis控制5种数据类型:String,list,hash,set,sorted-set 添加数据,删除数据,获取数据,查看有多少个元素,判断元素是否存在 key通用操作 JRedis:java操作redis 多数据库: 一个Redis实例可以包括多个数据库,客户端可以指定连接某个Redis数据库就好 一个Redis实例最多提供16个数据库,0~15 选中仓库: select 0 将当前仓库下的某个键值对的数据移动到其他仓库 move name 1 测试连接是否存活: p

Redis(四)Redis高级

一Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1:6379> SAVE OK 该命令将在 redis 安装目录中创建dump.rdb文件. 恢复数据 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可.获取 redis 目录可以使用 CONFIG 命令,如下所示: redis

redis 基础

一 redis数据类型redis支持5种类型的数据类型,它描述如下的:1. 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限.2. 哈希 Redis的哈希是键值对的集合. Redis的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象.3. 列表 Redis的列表是简单的字符串列表,排序插入顺序.您可以添加元素到Redis的列表的头部或尾部. 列表的最大长度为 232 - 1

初学者必须掌握的redis 基础

这篇文章总结了常用的redis基础知识,希望初学者能够从中受益. 一 redis数据类型 redis支持5种类型的数据类型,它描述如下的: 1. 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限. 2. 哈希 Redis的哈希是键值对的集合. Redis的哈希值是字符串字段和字符串值之间的映射,因此它们被用来表示对象. 3. 列表 Redis的列表是简单的字符串列表,排序插入顺序.您可以添