本文主要是介绍用redis的sadd和spop做后台抽奖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
今天简单介绍下实时抽奖后台的技术——生成随机唯一数。
实时抽奖主要要考虑公平性和效率,访问并发量可能非常高。后台最主要功能应该是这样的一个接口,每次用户点抽奖后,从某个数组或者集合中随机抽出一个值然后判断这个值是否中奖(这个逻辑是之前设定好的)。下面简单看看代码:
cache_key = 'myset' _list = [i for i in range(0, 10)] values = redis.sadd(cache_key, *_list) random = redis.spop(cache_key)其中:
sadd key member 添加一个string元素到,key对应的set集合中
spop key 删除并返回key对应set中随机的一个元素,如果set是空或者key不存在返回nil
简单封装下代码应该是这样的:
cache_key = 'myset' def getRandomValue():values = redis.smembers(cache_key)if not values:generateList()return redis.spop(cache_key)def generateList(numbers=10):_list = [i for i in range(0, numbers)]values = redis.sadd(cache_key, *_list)return valuesrandom = getRandomValue()
这段代码有个问题,就是set为空时候,spop返回nil,导致我无法判断是否有没生成过这个数组(即这个抽奖是所有数都抽完了,还是还没有开始呢?)所以我还需要有个标记信息,我再次修改代码:
cache_key = 'myset' def getRandomValue():values = redis.smembers(cache_key)if not values:flag = generateList()# 如果返回None,说明已经生成过数组且所有值已随机抽取完。 if not flag:return None return redis.spop(cache_key)def generateList(numbers=10):# flag 用于标记是否已经生成过List flag_key = 'FlagMyset' if redis.get(flag_key):return None else:_list = [i for i in range(0, numbers)]values = redis.sadd(cache_key, *_list)redis.set(flag_key, 1)return valuesrandom = getRandomValue()这样我就基本完成了。主要用到redis的sadd和spop操作。用redis进行这些操作,效率应该是没有任何问题。
这篇关于用redis的sadd和spop做后台抽奖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!