还是新建一个 redis_db.py
import redis
try:
pool = redis.ConnectionPool(
host="localhost",
port=6379,
password='',
db=0,
max_connections=100
)
except Exception as e:
print('redis链接错误:{0}'.format(e))
然后开始代码:
"""python使用reids模拟1000人的在线抢购"""
import executor as executor
from redis_db import pool
import redis
from concurrent.futures import ThreadPoolExecutor
import random
s = set()
while True:
if len(s) == 1000:
break
num = random.randint(10000, 100000)
s.add(num)
con = redis.Redis(
connection_pool=pool
)
try:
con.delete("kill_total", "kill_num", "kill_flag", "kill_user")
# 从新设置秒杀商品信息
con.set("kill_total", 50) #抢购商品50件
con.set("kill_num", 0)
con.set("kill_flag", 1)
# 设置过期时间
con.expire("kill_flag", 600)
except Exception as e:
# 异常提示
print(e)
finally:
# 关闭链接
del con
# 线程池,200
excutor = ThreadPoolExecutor(200)
def buy():
"""模拟购买东西"""
conn = redis.Redis(
connection_pool=pool
)
pipline = conn.pipeline()
try:
# 判断秒杀是否开启
if conn.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") # 每次加1
# 获取抢购成功的用户ID,上面的S列表里面去一个ID出来
user_id = s.pop()
# 把提取出来的ID存入reids
pipline.rpush("kill_user", user_id)
# 提交事务
pipline.execute()
except Exception as ee:
print(ee)
finally:
# 关闭事务,回收资源
if "pipline" in dir():
pipline.reset()
del conn
for i in range(0, 1000):
"""
线程池循环,模拟一千人抢购,提交1000个进程
"""
excutor.submit(buy())
print("秒杀结束...")
最终的效果可以查看redis里面的数据写入情况,一目了然。