SQL 必知必会
陈旸
清华大学计算机博士
73338 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
第一章:SQL语法基础篇 (19讲)
SQL 必知必会
15
15
1.0x
00:00/00:00
登录|注册

42丨如何使用Redis来实现多用户抢票问题

UNWATCH
WATCH
DISCARD
EXEC
MULTI
AOF(Append Only File)持久化
RDB(Redis DataBase)持久化
问题思考
乐观锁方式的并发控制
Redis事务中可能遇到的错误
运行结果
抢票模拟代码示例
使用Python的多线程
Python中使用Redis事务
Redis的事务处理命令
Redis的持久化模式
Redis的事务处理与RDBMS的事务的不同
事务满足的4个特性ACID
总结
模拟多用户抢票
Redis事务处理机制

该思维导图由 AI 生成,仅供参考

在上一篇文章中,我们已经对 Redis 有了初步的认识,了解到 Redis 采用 Key-Value 的方式进行存储,在 Redis 内部,使用的是 redisObject 对象来表示所有的 key 和 value。同时我们还了解到 Redis 本身用的是单线程的机制,采用了多路 I/O 复用的技术,在处理多个 I/O 请求的时候效率很高。
今天我们来更加深入地了解一下 Redis 的原理,内容包括以下几方面:
Redis 的事务处理机制是怎样的?与 RDBMS 有何不同?
Redis 的事务处理的命令都有哪些?如何使用它们完成事务操作?
如何使用 Python 的多线程机制和 Redis 的事务命令模拟多用户抢票?

Redis 的事务处理机制

在此之前,让我们先来回忆下 RDBMS 中事务满足的 4 个特性 ACID,它们分别代表原子性、一致性、隔离性和持久性。
Redis 的事务处理与 RDBMS 的事务有一些不同。
首先 Redis 不支持事务的回滚机制(Rollback),这也就意味着当事务发生了错误(只要不是语法错误),整个事务依然会继续执行下去,直到事务队列中所有命令都执行完毕。在Redis 官方文档中说明了为什么 Redis 不支持事务回滚。
只有当编程语法错误的时候,Redis 命令执行才会失败。这种错误通常出现在开发环境中,而很少出现在生产环境中,没有必要开发事务回滚功能。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Redis的事务处理机制和命令,以及如何利用Python的多线程和Redis的事务命令来模拟多用户抢票的过程。Redis的事务处理与传统的关系型数据库有所不同,它不支持事务的回滚机制,而是采用基于命令队列的方式进行事务处理。文章详细介绍了Redis的事务处理命令,包括MULTI、EXEC、DISCARD、WATCH和UNWATCH,并通过示例代码展示了如何使用这些命令来实现多用户抢票的模拟过程。同时,文章还强调了在并发请求情况下,需要通过WATCH+MULTI的方式来实现乐观锁,以确保事务的安全性。通过本文的阅读,读者可以快速了解Redis的事务处理机制和命令,并掌握如何利用Redis和Python来解决多用户抢票等并发操作的技术挑战。文章还提到了Redis事务中可能遇到的错误情况,以及通过锁的机制来解决共享资源并发访问的情况。同时,读者还被引导思考了关于Redis单线程程序和WATCH+MULTI方式实现乐观锁的并发控制的问题。整体而言,本文为读者提供了深入了解Redis事务处理和并发控制的技术知识,并通过实例代码展示了解决多用户抢票问题的方法。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《SQL 必知必会》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(19)

  • 最新
  • 精选
  • mickey
    客户端2首先返回 OK,客户端1返回 nil 。

    作者回复: 对的,客户端2 即使SET ticket的数值没有变化,也是对ticket进行了“修改”,也就是数据的版本发生了变化,因此和文章中的例子一样,客户端2会返回OK,客户端1是 nil

    2019-09-09
    19
  • tt
    单线程的REDIS也采用事物,我觉得主要是用来监视自己是否可以执行的条件是否得以满足,尤其是这个条件有可能不在REDIS自身的控制范围之内的时候。

    作者回复: 对的,单线程不一定代表要执行的事务的条件都满足,因为其他客户端的命令可能会在WATCH之后修改了KEY的值(如文中例子),导致事务条件不满足,打断事务执行的情况。

    2019-09-09
    2
    15
  • steve
    是否能用DECR实现呢?

    作者回复: 可以的,使用DECR 可以实现原子性的递减

    2019-09-09
    5
  • Demon.Lee
    返回结果跟之前一样,因为客户端1还是因为key变化了执行失败

    作者回复: Good Job

    2019-09-09
    2
    5
  • ABC
    推荐大家在Docker容器里面搭建各种开发环境,方便而且又不用配置特别多东西.以前我是在Windows上直接部署MySQL作为开发环境,后来就换到Docker了,才发现那么方便!~

    作者回复: 嗯 Docker很方便

    2019-11-26
    4
  • 小白菜
    总感觉后面这几篇讲的Redis,有点浅显,抛砖引玉一下。可能由于篇幅的缘故吧!

    作者回复: 嗯嗯 后面有机会再拓展写下

    2020-06-06
  • tt
    对于第一个问题,我觉得原因在于WATCH+MULTI主要是事物来监视自身执行得以的条件是否满足的

    作者回复: 对的

    2019-09-09
  • mickey
    上面的抢票时序,Redis是串行化的,不能在T2时刻同时两个客户端都执行Watch吧。

    作者回复: 对 串行化的,所以同一时刻也会进行串行化的处理,比如顺序为:客户端1 watch -> 客户端2 watch,或者是 客户端2 watch -> 客户端1watch,都有可能。

    2019-09-09
  • Monday
    思考题: 1、redis服务器只支持单进程单线程,但是redis的客户端可以有多个,为了保证一连串动作的原子性,所以要支持事务。 2、客户端2成功,客户端1失败。这个问题类似于Java并发的CAS的ABA问题。redis应该是除了看ticket的值外,每个key还有一个隐藏的类似于版本的属性。
    2019-09-09
    1
    24
  • 花见笑
    推荐使用 Redis 脚本功能 来代替事务 性能高出很多
    2020-01-07
    5
    6
收起评论
显示
设置
留言
19
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部