python使用MongoDB和Redis实现商品秒杀
时间: 2024-03-06 10:51:54 浏览: 162
好的,下面是Python使用MongoDB和Redis实现商品秒杀的示例代码。在这个示例中,我们使用Python的pymongo库和redis库来操作MongoDB和Redis。
首先,需要安装pymongo和redis库:
```
pip install pymongo redis
```
然后,连接MongoDB和Redis:
```python
import pymongo
import redis
# 连接MongoDB
mongo_client = pymongo.MongoClient('mongodb://localhost:27017/')
db = mongo_client['seckill']
# 连接Redis
redis_client = redis.Redis(host='localhost', port=6379, db=0)
```
接下来,定义商品和订单的数据结构,并初始化商品库存和秒杀开始时间:
```python
# 商品数据结构
product = {
'id': 1,
'name': 'iPhone 12',
'price': 5999,
'stock': 10
}
# 订单数据结构
order = {
'id': 1,
'user_id': 1,
'product_id': 1,
'quantity': 1,
'total_price': 0
}
# 初始化商品库存和秒杀开始时间
redis_client.hset('seckill', product['id'], f"{product['stock']},{time.time()}")
```
接下来,实现秒杀功能。在实现秒杀功能之前,需要先判断商品库存是否充足,如果充足,则减少库存并生成订单:
```python
# 秒杀函数
def seckill(user_id, product_id, quantity):
# 获取商品库存和秒杀开始时间
stock, start_time = map(int, redis_client.hget('seckill', product_id).split(','))
# 判断商品库存是否充足
if stock < quantity:
return False
# 开始秒杀
with redis_client.pipeline() as pipe:
while True:
try:
# 监视商品库存
pipe.watch('seckill')
# 判断商品库存是否充足
stock, start_time = map(int, pipe.hget('seckill', product_id).split(','))
if stock < quantity:
pipe.unwatch()
return False
# 开始事务
pipe.multi()
# 减少商品库存
pipe.hincrby('seckill', product_id, -quantity)
# 生成订单
order['id'] = db.counters.find_one_and_update({'_id': 'order_id'}, {'$inc': {'seq': 1}})['seq']
order['user_id'] = user_id
order['product_id'] = product_id
order['quantity'] = quantity
order['total_price'] = quantity * product['price']
db.orders.insert_one(order)
# 提交事务
pipe.execute()
return True
except redis.exceptions.WatchError:
# 事务失败,重试
continue
```
最后,测试秒杀功能:
```python
# 测试秒杀功能
seckill(1, product['id'], 1)
```
以上代码是Python使用MongoDB和Redis实现商品秒杀的示例,具体实现需要根据实际情况进行调整。
阅读全文