Redis中的事务(多命令)操作

作为一个nosql数据库,事务是必要功能.但是redis我们是可以理解为它不支持事务操作的,因为它的特征完全不满足我们对事物的正常理解

ps:我不知道是谁一开始提出redis支持事务的,但是我更倾向于这是redis的多命令功能
multi这个命令单词意思已经说明了一切,我只能理解为中文文档一厢情愿了

事务的使用

1. 开启事务

命令:multi

127.0.0.1:6379> multi
OK

执行该命令后,连接会进入事务模式

2.执行操作

可以执行任意的redis数据操作命令,那么执行操作会进入一个待执行队列

127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set age 34
QUEUED

3.提交事务

命令:exec
提交之后,待执行队列中的命令将执行

127.0.0.1:6379> exec
1) OK
2) OK

待执行队列清除

清空队列:discard

事务的具体情况处理

Redis事务的特点

1.没有隔离级别的概念

开启事务之后的操作全部是在待执行队列中缓存,并没有真正执行,也就不存在事务内部的查询要看到事务即将的更新,事务外部也不知道

2.不保证原子性

Redis对单条命令是保证原子性(比如批量msetnx命令),但是如果事务不保证原子性(一致性),就没有回滚的概念了.事务中任何命令的失败,其余命令任会执行

可以这么说.Redis的以上两个事务特征几乎可以认为,redis没有事务功能.更应该称之为命令的打包执行.
那么为什么redis中要有事务?举个例子:假设登录的时候记录登录的ip(一条命令操作),接下再执行保存用户的登录消息操作(一条命令),假设获取用户的消息需要在另外一个系统中获取,我们无法保证100%获取到.但是这两步操作在我们程序业务功能设计中应该被认为是登录操作的单个功能起的影响.因为获取用户的登录消息可能会失败.那么就没必要记录ip了.redis恰恰提供事务名队列的清空功能

可以怎么理解,如果你的(命令)操作步骤非常多,每一个命令都需要大量的其他非redis的操作才能保证接下来的业务进行,那么就需要redis的事务队列功能一步一步记录命令,在整个工程中如果发生了意外则清空队列,正常则提交

所以我们应该在我们的程序代码中保证一致性和隔离级别的功能而不是交给redis,方正redis的事务就是打包执行,任何利用是查询设计的问题

在redis开启事务的魅力multi就可以知道,redis自己本身也没有把这个功能称之为事务.正确的叫法是多命令

3.若在待执行队列中存在语法性错误,exec提交之后,其他正确命令也会被执行,这是单单的错误命令抛出异常

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name li si #错误的命令
QUEUED
127.0.0.1:6379> set money 100
QUEUED
127.0.0.1:6379> exec
1) (error) ERR syntax error
2) OK

如果是错误的命令名(比如setnx写成setnn,则不能称之为语法错误),如果在队列中出现了类似错误,则整个队列不成功

watch

语法:watch key
watch类似于乐观锁

如果在watch命令观测一个key之后,开启事务后修改该key.这个时候如果有其它连接修改了key,则会导致事务执行失败,在这个事务的其他操作也是失败
exec之后,watch命令监控取消

watch命令可以说是redis的事务功能最关键的运用了,在使用了watch之后可以保证一定的原子性和数据安全

原文地址:https://www.cnblogs.com/liangshu/p/12419430.html

时间: 2024-10-31 07:12:43

Redis中的事务(多命令)操作的相关文章

在adb shell中直接使用sqlite3命令操作数据库

在adb shell中直接使用sqlite3命令操作数据库 一般,手机在开发阶段都是会将sqlite3模块打入镜像.例如在安卓5.1中,路径为/system/xbin/sqlite3.(但对于普通手机,不一定能自带此模块,因此此文只针对于手机研发阶段调试) 首先查看手机中sqlite3文件是否存在,若存在才可在adb shell下直接使用sqlite3命令: 示例:更改系统设置数据库中的设置项:Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED (

Redis 中的事务

Redis支持简单的事务 Redis与mysql事务的对比 Mysql Redis 开启 start transaction muitl 语句 普通sql 普通命令 失败 rollback 回滚 discard 取消 成功 commit exec 注: rollback与discard 的区别 如果已经成功执行了2条语句, 第3条语句出错. Rollback后,前2条的语句影响消失. Discard只是结束本次事务,前2条语句造成的影响仍然还在 注: 在mutil后面的语句中, 语句出错可能有2

辛星浅谈Redis中的事务

Redis也提供了对事务的支持,在Redis中,我们常用的命令就是multi.exec.discard.watch这四个命令.其中multi命令用于开始一个事务,该语句之后的所有命令都会被视为事务之内的操作,而exec是提交一个事务,discard是回滚一个事务. 下面是对一些命令的具体介绍: multi----用于标记事务的开始,其后执行的命令都被存放于命令队列,直到执行exec时,这些命令才会被原子的执行.它的返回值总是OK. exec----执行在一个事务内命令队列中的所有命令,同时将当前

八、Redis 中的事务

Redis支持简单的事务 Redis与 mysql事务的对比 Mysql Redis 开启 start transaction multi 语句 普通sql 普通命令 失败 rollback 回滚 discard 取消 成功 commit exec 注: rollback与discard 的区别 如果已经成功执行了2条语句, 第3条语句出错. Rollback后,前2条的语句影响消失. Discard只是结束本次事务,前2条语句造成的影响仍然还在 注: 在mutil后面的语句中, 语句出错可能有

Redis运维之常用命令操作

在平时的工作中,需要根据需求对Redis数据库进行一些操作. 可以参考Redis官网http://redis.io/commands 进行详细了解 1.SELECT 切换数据库 redis 127.0.0.1:6379[1]> HELP SELECT     SELECT index   summary: Change the selected database for the current connection   since: 1.0.0   group: connection   red

06 redis中set结构及命令详解

集合 set 相关命令 集合的性质: 唯一性,无序性,确定性 注: 在string和link的命令中,可以通过range 来访问string中的某几个字符或某几个元素 但,因为集合的无序性,无法通过下标或范围来访问部分元素. 因此想看元素,要么随机先一个,要么全选 sadd key value1 value2 作用: 往集合key中增加元素 srem value1 value2 作用: 删除集合中集为 value1 value2的元素 返回值: 忽略不存在的元素后,真正删除掉的元素的个数 spo

08 redis中hash结构及命令详解

Hash 哈希数据类型相关命令 hset key field value 作用: 把key中 filed域的值设为value 注:如果没有field域,直接添加,如果有,则覆盖原field域的值 hmset key field1 value1 [field2 value2 field3 value3 ......fieldn valuen] 作用: 设置field1->N 个域, 对应的值是value1->N (对应PHP理解为 $key = array(file1=>value1, f

sqlSever 存储过程 中 创建 事务(增删改操作),唯一的主键自动生成 (格式:自定义字母+时间+五位数字,例如:S2014103010001)

描叙: 1.使用带事务的sql 存储过程. 2.添加数据时,自动创建唯一的主键 格式 [一个字母]+[时间格式]+[一个五位数] 3.使用游标,通过另一个表的多条数据,来对当前表数据的添加,并自动生产 唯一主键 格式如上. 4.使用场景:增加主键唯一的主表数据的同时,从另一个表读取多条数据然后添加到子表中,并且生产的主键唯一. 5.使用环境: sqlserver. USE [MicroMall]GO/****** Object: StoredProcedure [dbo].[SaleOrderI

Redis中的数据结构与常用命令

开发系统:Ubuntu 17.04Redis驱动:StackExchange.Redis 1.2.3Redis版本:3.2.1开发平台:.NET Core 对于Redis的介绍这里只写一句:Redis是一种基于内存的高性能非关系型数据库,它以kye-value的形式来存储数据. 5种数据结构 Redis中包含5种数据类型:STRING.LIST.SET.HASH.ZSET. Redis中的5中数据结构(截图出自<Redis in Action>): Redis以key-value形式存储数据,