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 竞争状态下如何解决库存的正确减少("超卖" ...
随机推荐
- 选课系统项目_python
一.功能简要 基本实现以下功能,但是有部分地方由于时间关系并未写,而且并未做细微的完善,大致功能完成.角色:学校.学员.课程.讲师要求:1. 创建北京.上海 2 所学校2. 创建linux , pyt ...
- ASP.NET一般处理程序之网站请求过程
- Spring 理解和开始
1.先看看Spring的历史吧 https://baijiahao.baidu.com/s?id=1620099105315862154&wfr=spider&for=pc 2.Spr ...
- layui的跳转链接实现分页low
layui.use(['laypage', 'layer'], function(){ var laypage = layui.laypage ,layer = layui.layer; laypag ...
- POJ1776(哈密顿路径)
题目: http://poj.org/problem?id=1776 题意: 给出一个n*n的矩阵,若第i个任务做完之后可以做第j个任务,则矩阵的第i行第j列为1,否则为0.机器完成一项任务之后会自动 ...
- yarn 不要一起用 npm
yarn 不要一起用 npm 如果一起用,看下lock 的版本一样不,不一样可能会出现问题
- springBoot 2.1.5 pom 文件 unknown 错误
插件不兼容 pom文件添加 <properties> <maven-jar-plugin.version>2.6</maven-jar-plugin.version ...
- 关于Git的右键菜单消失的处理
右键菜单 Git Bash Here window + R,输入regedit回车进入注册表 进入如下目录 HKEY_CLASSES_ROOT\Directory\Background\shell 在 ...
- easy_thinking
登陆抓包,改成32位,根据tp6任意创建文件的漏洞,修改cookie. 上传文件. 木马在/runtime/session下, 然后传bypass文件绕过disablefunction,得到flag
- CodeForce 377 A mazes(dfs+连通性问题)
Pavel 喜欢网格迷宫.一个网格迷宫是一个 n × m 的长方形迷宫,其中每个单元格要么是空白的,要么是墙体.您可以从一个单元格走到另一个单元格,只要两个单元格均是空白的,且拥有一条公共的边. Pa ...