07: redis分布式锁解决超卖问题

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-18 22:21:15

1.1 redis事物

  1、redis事物介绍

      1. redis事物是可以一次执行多个命令,本质是一组命令的集合。

      2. 一个事务中的所有命令都会序列化,按顺序串行化的执行而不会被其他命令插入

      作用:一个队列中,一次性、顺序性、排他性的执行一系列命令 

  2、使用Multi指令演示 redis 事物

      1. 下面指令演示了一个完整的事物过程,所有指令在exec前不执行,而是缓存在服务器的一个事物队列中

      2. 服务器一旦收到exec指令才开始执行事物队列,执行完毕后一次性返回所有结果

      3. 因为redis是单线程的,所以不必担心自己在执行队列是被打断,可以保证这样的“原子性”

      注:redis事物在遇到指令失败后,后面的指令会继续执行

# Multi 命令用于标记一个事务块的开始事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令原子性( atomic )地执行
> multi(开始一个redis事物)
incr books
incr books
> exec (执行事物)
> discard (丢弃事物)
[root@redis ~]# redis-cli
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set test 123
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set test 456
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379> 
在命令行测试redis事物
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import redis
r = redis.Redis(host='127.0.0.1')
pipe = r.pipeline()
pipe.multi()             #开启事务
pipe.set('key2', 4)      #存储子命令
pipe.execute()           #执行事务
print(r.get('key2'))
使用python测试redis事物

  3、mysql的rollback与redis的discard的区别

      1. mysql回滚为sql全部成功才执行,一条sql失败则全部失败,执行rollback后所有语句造成的影响消失

      2. redis的discard只是结束本次事务,正确命令造成的影响仍然还在.

        1)如果在一个事务中的命令出现错误,那么所有的命令都不会执行
        2)如果在一个事务中出现运行错误,那么正确的命令会被执行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1111111111111

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!