Redis 中的事务

Redis支持简单的事务

Redis与mysql事务的对比


Mysql


Redis


开启


start
transaction


muitl


语句


普通sql


普通命令


失败


rollback
回滚


discard
取消


成功


commit


exec

注:
rollback与discard
的区别

  • 如果已经成功执行了2条语句,
    第3条语句出错.
  • Rollback后,前2条的语句影响消失.
  • Discard只是结束本次事务,前2条语句造成的影响仍然还在

注:

在mutil后面的语句中,
语句出错可能有2种情况

  1. 语法就有问题,

这种,exec时,报错,
所有语句得不到执行

2.   语法本身没错,但适用对象有问题.
比如zadd
操作list对象

Exec之后,会执行正确的语句,并跳过有不适当的语句.

(如果zadd操作list这种事怎么避免?
这一点,由程序员负责)    需要程序员手动控制操作

思考:

我正在买票

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
redis 127.0.0.1:6379> exec
(nil) // 返回nil,说明监视的ticket已经改变了,事务就取消了.
redis 127.0.0.1:6379> get ticket
"0"
redis 127.0.0.1:6379> get money
"200"

watch
key1 key2 ... keyN

作用:监听key1
key2..keyN有没有变化,如果有变,
则事务取消

unwatch

作用:
取消所有watch监听

时间: 2024-12-25 16:05:28

Redis 中的事务的相关文章

辛星浅谈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中的事务(多命令)操作

作为一个nosql数据库,事务是必要功能.但是redis我们是可以理解为它不支持事务操作的,因为它的特征完全不满足我们对事物的正常理解 ps:我不知道是谁一开始提出redis支持事务的,但是我更倾向于这是redis的多命令功能 multi这个命令单词意思已经说明了一切,我只能理解为中文文档一厢情愿了 事务的使用 1. 开启事务 命令:multi 127.0.0.1:6379> multi OK 执行该命令后,连接会进入事务模式 2.执行操作 可以执行任意的redis数据操作命令,那么执行操作会进

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形式存储数据,

redis学习(5) - 事务

1.redis中的事务是一组命令的集合.一个事务中的命令,要么都执行,要么都不执行 2. MULTI    告诉redis:下面我发给你的命令属于同一个事务,先不要执行,而是把它们暂时存起来 OK SADD "user:1:followers" 2   发送命令 QUEUED                返回QUEUED表示这两条命令已经进入等待执行的事务队列中了 SADD "user:2:followers" 1 QUEUED EXEC            

Redis源码分析(三十六)--- Redis中的11大优秀设计

坚持了一个月左右的时间,从最开始的对Redis的代码做分类,从struct结构体分析开始,到最后分析main主程序结束,中间,各大模块的代码逐个击破,学习,总之,收获了非常多,好久没有这么久的耐心把一个框架学透,学习一个框架,会用那只是小小的一部分,能把背后的原理吃透才是真功夫.在这个学习的最后阶段,是时候要来点干货了,我把这1个多月来的一些总结的一些比较好的代码,和设计思想总结出来了,原本想凑成10大精彩设计的,可后来感觉每个点都挺精彩的,还是做成了11大优秀设计,包证让你打开研究,这里无关语

04: redis 消费模式 和 事务 - 扩展slow日志

Redis发布消息模式 生产消费模型 Redis发布消息通常有两种模式: 1:队列模式(queuing) 2:发布-订阅模式(publish-subscribe) 任务队列:顾名思义,就是“传递消息的队列”.与任务队列进行交互的实体有两类,一类是生产者(producer),另一类则是消费者(consumer).生产者将需要处理的任务放入任务队列中,而消费者则不断地从任务独立中读入任务信息并执行. 任务队列的好处: 松耦合. 生产者和消费者只需按照约定的任务描述格式,进行编写代码. 易于扩展. 多

Redis 中 5 种数据结构的使用场景介绍

这篇文章主要介绍了Redis中5种数据结构的使用场景介绍,本文对Redis中的5种数据类型String.Hash.List.Set.Sorted Set做了讲解,需要的朋友可以参考下 一.redis 数据结构使用场景 原来看过 redisbook 这本书,对 redis 的基本功能都已经熟悉了,从上周开始看 redis 的源码.目前目标是吃透 redis 的数据结构.我们都知道,在 redis 中一共有5种数据结构,那每种数据结构的使用场景都是什么呢? String——字符串 Hash——字典

数据库中的事务和并发问题探讨

数据库中的事务和并发问题探讨 引子 最近有同事写了段代码,负责创建订单的逻辑,代码审查时发现可能会有并发的问题.同事并不认同,他认为他的逻辑是写在存储过程中的,应该没有问题. 代码的逻辑大概是(伪代码): begin transaction if 查询到客户存在进行中的订单 rollback transaction if 查询到设备存在进行中的订单 rollback transaction 插入订单 commit transaction 下面针对这个逻辑进行分析,为什么这个事务会出现并发问题.