博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis 解决秒杀
阅读量:4983 次
发布时间:2019-06-12

本文共 2017 字,大约阅读时间需要 6 分钟。

#

import redispool = redis.ConnectionPool(host = '127.0.0.1', port=6379, db=0)#创建连接池r = redis.Redis(connection_pool = pool) # 初始化 redispipe = r.pipeline()  #初始化管道KEY = 'count'try:    pipe.watch(KEY)         # 监听库存    pipe.multi()            # 开始事务    pipe.set(KEY, 2)        # 执行操作    pipe.execute()          # 执行事务except Exception as e:    # 事务执行过程中,如果数据被修改,则抛出异常,程序可以选择重试或退出    passfinally:    pipe.reset()            # 重置管道,为重试做准备

 

import redisfrom threading import Thread# 创建连接池pool = redis.ConnectionPool(host = '127.0.0.1', port=6379, db=0)# 初始化 redisr = redis.Redis(connection_pool = pool)KEY="count"     # 库存 keyclass BaseThread(Thread):  # 封装异步多线程工具    def __init__(self, func, *args, **kwargs):        super(BaseThread, self).__init__()        self.func = func        self._args = args        self._kwargs = kwargs    def run(self):        self.func(*self._args, **self._kwargs)def sell(i):   #售卖方法    i 用户    with r.pipeline() as pipe:              # 初始化 pipe        while 1:            try:                pipe.watch(KEY)             # 监听库存                c = int(pipe.get(KEY))      # 查看当前库存                if c > 0:                   # 有库存则售卖                    pipe.multi()            # 开始事务                    c -= 1                    pipe.set(KEY, c)        # 减少库存                    pipe.execute()          # 执行事务                    # 抢购成功并结束                    print('用户 {} 抢购成功,商品剩余 {}'.format(i, c))                    break                else:                    # 库存卖完,抢购结束                    print('用户 {} 抢购停止,商品卖完'.format(i))                    break            except Exception as e:                # 抢购失败,重试                print('用户 {} 抢购失败,重试一次'.format(i))                continue            finally:                # 重置 pipe,准备下次抢购                pipe.reset()if __name__ == "__main__":    r.set(KEY, 10)                  # 初始化 10 个库存    for i in range(15):             # 共 15 个人开始抢购        t = BaseThread(sell, i)        t.start()

 

转载于:https://www.cnblogs.com/zhangchen-sx/p/11200705.html

你可能感兴趣的文章
nalply/crtmpserver
查看>>
jquery 遍历节点
查看>>
工具选择
查看>>
(转)C#实现RSA非对称加密解密
查看>>
迅为iTOP-4412开发板-Android4.4-固定MAC
查看>>
centos下,安装MySQL以及配置远程连接等
查看>>
获取硬盘和CPU的序列号
查看>>
Python全栈开发 day2 - 数据类型详解
查看>>
葡萄城报表的数据可视化分析
查看>>
(转)面向对象的三大基石(封装,继承和复合,多态)
查看>>
jquery $.ajax $.get $.post的区别?
查看>>
python中运行pip出现Fatal error in launcher错误
查看>>
2017北京国庆刷题Day7 afternoon
查看>>
bzoj千题计划108:bzoj1018: [SHOI2008]堵塞的交通traffic
查看>>
C++集成设计环境——Code::Blocks安装过程
查看>>
Maven小记
查看>>
一定不要在头文件中using namespace XXX
查看>>
运行百度语音识别官方iOS demo报错: load offline engine failed: 4001
查看>>
THREE.OrbitControls参数控制
查看>>
iOS开发--XMPPFramework--好友列表(五)
查看>>