redis 解决秒杀
#
import redis
pool = redis.ConnectionPool(host = '127.0.0.1', port=6379, db=0)#创建连接池
r = redis.Redis(connection_pool = pool) # 初始化 redis
pipe = r.pipeline() #初始化管道
KEY = 'count'
try:
pipe.watch(KEY) # 监听库存
pipe.multi() # 开始事务
pipe.set(KEY, 2) # 执行操作
pipe.execute() # 执行事务
except Exception as e:
# 事务执行过程中,如果数据被修改,则抛出异常,程序可以选择重试或退出
pass
finally:
pipe.reset() # 重置管道,为重试做准备
import redis
from threading import Thread # 创建连接池
pool = redis.ConnectionPool(host = '127.0.0.1', port=6379, db=0)
# 初始化 redis
r = redis.Redis(connection_pool = pool)
KEY="count" # 库存 key class 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()
redis 解决秒杀的更多相关文章
- 解决秒杀活动高并发出现负库存(Redis)
商城在秒杀活动开始时,同时有好多人来请求这个接口,即便做了判断库存逻辑,也难免防止库存出现超卖,造成损失 Django中的ORM本身就对数据库做了防范,但再过亿级访问也扛不住 下面利用Redis的过载 ...
- PHP 使用redis实现秒杀
PHP 使用redis实现秒杀 使用redis队列,因为pop操作是原子的,即使有很多用户同时到达,也是依次执行,推荐使用(mysql事务在高并发下性能下降很厉害,文件锁的方式也是) 先将商品库存如队 ...
- 豌豆夹Redis解决方式Codis源代码剖析:Proxy代理
豌豆夹Redis解决方式Codis源代码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描写叙述: Codis is a proxy b ...
- centos6.7用yum安装redis解决办法及IP限制配置
在centos6.7用yum安装redis解决办法 - bluesky1 - 博客园 http://www.cnblogs.com/lanblogs/p/6104834.html yum instal ...
- 使用Spring Session和Redis解决分布式Session跨域共享问题
http://blog.csdn.net/xlgen157387/article/details/57406162 使用Spring Session和Redis解决分布式Session跨域共享问题
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- 如何运用PHP+REDIS解决负载均衡后的session共享问题
一.为什么要使用Session共享? 稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名.密码在整个网站的 ...
- IDEA SpringBoot+JPA+MySql+Redis+RabbitMQ 秒杀系统
先放上github地址:spike-system,可以直接下载完整项目运行测试 SpringBoot+JPA+MySql+Redis+RabbitMQ 秒杀系统 技术栈:SpringBoot, MyS ...
- redis解决商品秒杀问题
博主最近在项目中遇到了抢购问题!现在分享下.抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖" ...
随机推荐
- win10中安装与配置maven
原文链接:https://www.cnblogs.com/wkrbky/p/6350334.html Maven安装配置(Windows10) 想要安装 Apache Maven 在Windows 系 ...
- 双 leave 栈迁移的坑
目录 简介 问题 解决办法 简介 之前在复现自己做出来的题时,一样的思路发现拿不了 shell 了,后来发现是栈迁移的坑. 问题 假设 32 位系统中,漏洞函数可以任意写入 0x0000000 ...
- 树莓派使用Python使用PiCamera录制视频
个人博客 地址:https://www.wenhaofan.com/article/20190430144020 代码 在树莓派环境下官方提供了乐酷 PiCamera 让我们可以很方便的操作树莓派连接 ...
- ubuntu python 安装使用虚拟环境 virtualenv
1,虚拟环境是干啥用的? 我在电脑上装了cuda,显卡驱动,cudnn等一堆配套文件,然后又依赖于cuda和驱动安装了tensorflow2.0的gpu测试版,不知为何,我每次跑完tf2程序电脑都会卡 ...
- 使用xshell
将选定的文本自动复制到剪贴板 并且 鼠标向右按钮定义为粘贴剪贴板内容
- Udacity_deep_learning_anconda
1.创建anconda的虚拟环境: conda create -n your_env_name Python=X.X(2.7.3.6等) 2.查看anconda 有哪些虚拟环境: conda env ...
- [CQOI2015] 网络吞吐量 - 最大流,最短路
在第i个点只能选A[i]次的情况下,能选出多少条1-n的最短路 Solution 我们造出最短路DAG,然后对每个点拆点限流,跑最大流即可 双向边警告!(有悖直觉 #include <bits/ ...
- 《JavaScript ES6 函数式编程入门经典》--推荐指数⭐⭐⭐
这本书比较基础认真看完再自己写点demo一个双休日就差不多, 总体来说看完还是有收获的,会激起一些你对函数编程的兴趣 主要目录如下: 第1章 函数式编程简介 11.1 什么是函数式编程?为何它重要 1 ...
- ubuntu18.04 编译fortran出现 ‘没有f951这个文件’处理
机器自带了gcc所以可以编译fortran文件, 使用时, gcc **.for –o ***.out 提示,没有找到f951. 然后去网上找解决方案,有的人说在其他地方找到了f951,然后把他复制到 ...
- 初识消息队列--ActiveMq
消息队列 即MessageQueue,是一种消息中间件,在遇到系统请求量比较大的情况下,导致请求堆积过多无法及时返回,可以通过它进行异步的消息处理,从而缓解系统压力. ActiveMq ActiveM ...