博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用redis的sadd和spop做后台抽奖
阅读量:4299 次
发布时间:2019-05-27

本文共 1373 字,大约阅读时间需要 4 分钟。

今天简单介绍下实时抽奖后台的技术——生成随机唯一数。

实时抽奖主要要考虑公平性和效率,访问并发量可能非常高。后台最主要功能应该是这样的一个接口,每次用户点抽奖后,从某个数组或者集合中随机抽出一个值然后判断这个值是否中奖(这个逻辑是之前设定好的)。下面简单看看代码:

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 values    random = getRandomValue()
这样我就基本完成了。主要用到redis的sadd和spop操作。用redis进行这些操作,效率应该是没有任何问题。

转载地址:http://ulvws.baihongyu.com/

你可能感兴趣的文章
git 常用命令 入门
查看>>
linux安装docker
查看>>
关闭selinx nginx无法使用代理
查看>>
shell 脚本部署项目
查看>>
spring cloud zuul网关上传大文件
查看>>
springboot+mybatis日志显示SQL
查看>>
工作流中文乱码问题解决
查看>>
maven打包本地依赖包
查看>>
spring boot jpa 实现拦截器
查看>>
jenkins + maven+ gitlab 自动化部署
查看>>
Pull Request流程
查看>>
Lambda 表达式
查看>>
函数式数据处理(一)--流
查看>>
java 流使用
查看>>
java 用流收集数据
查看>>
java并行流
查看>>
CompletableFuture 组合式异步编程
查看>>
mysql查询某一个字段是否包含中文字符
查看>>
Java中equals和==的区别
查看>>
JVM内存管理及GC机制
查看>>