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 竞争状态下如何解决库存的正确减少("超卖" ...
随机推荐
- 集合使用 Iterator 删除元素
针对常见的数据集合,比如 ArrayList 列表,对其进行遍历,删除其中符合条件的某个元素,使用 iterator 迭代器进行迭代,代码如下: public class PracticeContro ...
- 问题 E: Problem B
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> ...
- 二叉树(5)HuffmanTree
构建一棵 HuffmanTree. 测试代码 main.cpp: #include <iostream> #include "HuffmanTree.h" using ...
- data_analysis 第一课
1.anaconda的安装与使用 在官网下载anaconda的客户端,因为python有2和3之分,所以有两个版本可以供选择,由于该课程使用2作为开发工具,选择anaconda2下载安装. 安装好之后 ...
- 一些java基础知识的备忘
接口和抽象类的区别是什么? 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法. 接口中除了static.final变量 ...
- 在bootstrap的column中的formatter里不能传递row参数吗?
row 是一个对象 你需要把它转成字符串用JSON.stringify(row),这样就是字符串了,但是还有问题,你需要给加密一下encodeURI(JSON.stringify(row)),然后方 ...
- Python之QRCode
目录 一.基本介绍 介绍 QRCode二维码版本展示 QRCode方法 常用函数 二.安装QRCode 三.基本案例 生成普通二维码: 生成带有图片的二维码: 四.制作动态二维码 安装 myqr 和 ...
- 白面系列 mongoDB
mongoDB和redis一样,都是noSQL技术之一. redis是Key-Value存储,mongoDB是文档存储. 文档存储一般用类似json的格式存储,存储的内容是文档型的.文档是一组键值(k ...
- Python并发学习
#Python并发 多任务 多进程 多线程 线程同步 #多任务处理 多任务处理:使得计算机可以同时处理多个任务 听歌的同时QQ聊天.办公.下载文件 实现方式:多进程.多线程 #程序和进程 程序:是一个 ...
- promise的连缀写法
promise的连缀写法 以上写法相当于写了两个实例 promise.all() 1. promise.all() all这个方法是 promise 构造函数的成员不是实例对象成员,这个方法接受一个参 ...