关于redis开启事务机制的问题
老师在这个课堂内容中,关于撰写redis事务机制模拟秒杀活动我有问题:
代码块1:
try: if connection.exists('kill_flag') == 1: pipline.watch('kill_num','kill_user') total = int(pipline.get('kill_total').decode('utf-8')) num = int(pipline.get('kill_num').decode('utf-8')) if num < total: pipline.multi() pipline.incr('kill_num') user_id = s.pop() pipline.rpush('kill_user', user_id) pipline.execute()
代码块2:
for i in range(0, 1000): executor.submit(buy)
1)按照之前课程所描述的,当redis开启pipline.watch('kill_num', 'kill_user')时开启事务pipline.multi()后,当线程池异步执行buy任务的时候相当于有多个redis客户端同时修改pipline.watch()中的参数kill_num的数值,依照redis的事务机制当被检测的数据记录发生变化的时候,处在运行阶段的事务会被中断,那么在kill_num不断变化的阶段(kill_num<50的情况下)随着线程不断执行,redis中关于if num < total:以下的业务都会随着kill_num的数量不断加1而反复的终止业务
2)在这种情况下,redis在事务在由于kill_num不断变化的情况下不断被打断,这种情况下是如何能将pipline.rpsh('kill_user', user_id)以及kill_num等数据写入到redis中的?
这个逻辑我有些发蒙,绕不出来了,谢谢老师解答。
正在回答
同学,你好!redis 是事务相当于批处理,先将multi()到execute()之间的代码指令保存下来,当执行到execute()时,才会将保存的指令发送到redis去执行。假设客户端A(A用户)在修改kill_num,B客户端也要执行事务,当B客户端发现客户端A 在修改kill_num,那么B客户端的事务就关闭取消了,本次秒杀失败了。只能再次重新秒杀,重新开始事务并提交。不是提交就能成功的,什么时候提交的事务发现没有客户端在改数据,才会执行事务,所以才称为秒杀。同学可以看下视频:https://class.imooc.com/lesson/2182#mid=51488的8:20秒处---9:30秒和11:00--12:30秒处的内容
祝学习愉快~
- 参与学习 人
- 提交作业 16233 份
- 解答问题 4470 个
全新版本覆盖5大热门就业方向:Web全栈、爬虫、数据分析、软件测试、人工智能,零基础进击Python全能型工程师,从大厂挑人到我挑大厂,诱人薪资在前方!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星