写一段redis锁的抽奖活动
时间: 2023-10-14 10:08:49 浏览: 99
好的,以下是一段基于Redis锁实现的抽奖活动代码:
```python
import redis
import time
import random
# 创建Redis连接
redis_client = redis.Redis(host='localhost', port=6379, db=0)
# 设置锁的键名
lock_key = 'prize_draw_lock'
# 设置奖品池
prize_pool = ['一等奖', '二等奖', '三等奖']
def prize_draw(user_id):
# 获取锁
while not redis_client.setnx(lock_key, 1):
time.sleep(0.1)
try:
# 确认用户是否已经中过奖
if redis_client.hget('prize_draw_record', user_id):
print(f'用户{user_id}已经中过奖了')
return
# 抽奖
prize = random.choice(prize_pool)
# 记录中奖信息
redis_client.hset('prize_draw_record', user_id, prize)
print(f'用户{user_id}中奖了,奖品是{prize}')
finally:
# 释放锁
redis_client.delete(lock_key)
# 测试
prize_draw('user1')
prize_draw('user2')
prize_draw('user3')
prize_draw('user1')
```
这段代码中,我们使用了Redis的setnx命令来获取锁。如果锁已经被其他用户获取,则等待0.1秒重新尝试获取锁。在获取到锁后,我们先判断用户是否已经中过奖,如果已经中过奖则直接返回,否则进行抽奖并记录中奖信息。最后释放锁。
阅读全文