关于两种使用Redis的随机抽取的方式的记录

        根据实际业务的需要,有时候会出现需要随机发放、随机抽取某些奖券、红包等等的业务场景,这些业务场景都是需要快速、随机、稳定的发放某些业务产品,在日常的使用中,我总结了两种,使用Redis来实现随机抽取业务场景的实现形式,特在此记录,以做备份和分享:

        第一种:使用Redis的集合Set,来实现随机的抽取的功能,这就用到了Set的一个方法:

               SPOP key [count] 移除并返回集合中的随机元素

        使用方法是,提前将全部的内容都放到Redis中,在实现抽取时,全部使用Redis来实现,基本可以快速、稳定。但是,因为Set是无序且唯一的,如果需要抽取的产品中有重复的存在时,这个方法,就不可行了,重复的内容,再保存到Redis中时,只会保存一份。这样也就牵出了第二种实现随机抽取的方法。

第二种:使用Redis的集合List,来实现随机的抽取的功能.

        List类似于一个队列,每个元素查找时需要使用下标,加入到List中时,是有序的,可以选择往队头添加或者往队尾添加。

        实现随机抽取这个功能,主要是使用:

        LLEN key  获取列表长度:

                Redis Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。

        LINDEX key index 通过索引获取列表中的元素:

                Redis Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

        LREM key count value 移除列表元素:

                Redis Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。

COUNT 的值可以是以下几种:

                count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 

                count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。

                count = 0 : 移除表中所有与 VALUE 相等的值。

        实现随机抽取的功能,主要是这三个方法相互配合使用。

        首先,获取到整个列表的长度,目的是知道整个列表的下标的范围,然后,使用生成随机数的算法,在整个下标的范围内,随机生成一个可用、有效的下标。

        第二步,拿着随机生成的下标,使用Lindex方法获取到这个下标对应的值,也就是获取到了我们需要的随机抽取出来的值。

        第三步,拿着随机抽取出来的值,调用Lrem,来删除一个与抽取出来的值相同的一个列表List中的一个元素。保证相同的值不会被多次获取,造成重复。

        其中,需要注意的是,获取列表长度这个操作,需要在每次生成随机数之前调用一次,保证获取的是正确的长度,不要造成长度大于实际列表的长度的问题,造成了取不到指定下标的值的问题。

        当然,随机抽取的整个业务中,还涉及了对Redis加锁,每次抽取完成后释放锁;对整个接口进行限流避免并发量过高;持久化整个抽取结果等等的问题,这些就不再详细的一个一个的进行解决了,你可以使用你成熟并且喜欢的形式解决这些问题,我这里只是提供一个解决随机抽取问题的一个思路。

        当然,你如果也有其他的方法,或者对我提出的解决方案有更好的优化的方式,你可以直接联系我,我非常高兴能够接受各位大佬的指点。

 

        

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值