Redis维护的权重型集合实现(redis 集合权重)
抢购
Redis 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,主要用于数据的存储、查询,现在也广泛用于分布式锁、消息系统等领域,其中权重型集合的实现也被广泛应用。
权重型集合通常用在抢购活动中,主要思想是通过设定一系列不同的权重值来给抢购机会赋予不同的抢购几率,通过抽取到重复值或者错过值来构成我们需要的抢购结果,也可以用于分流、抽奖等场景。 Redis权重型集合实现对这种场景很有效,简单来说只需要实现以下步骤:
(1)初始化一个集合: Redis 中通过SortedSets来实现,代码如下:
jedis.zadd("zset", member1Score, member1);
...jedis.zadd("zset", memberNScore, memberN);
其中zset 表示集合的名字,memberScore 代表用户的权重值,member名字为用户的名字,可以是一个ID或其他字段。
(2)获取抢购结果:通过ZRANGEBYSCORE函数实现,代码如下:
Set result = jedis.zrangeByScore("zset", min, max);
这里min 和max 分别代表前一个用户取到的最大权重值和当前用户获取到的权重值,jedis.zrangeByScore函数会返回[min,max]范围内的所有权重和对应的名字,并以set的形式返回,它也是有顺序的,返回的权重是由小到大排列。
(3)更新权重:当一个用户抢到指定商品之后,就需要将他的权重更新,通过 ZINCRBY 函数实现,代码如下:
jedis.zincrby("zset", delta,member);
其中 delta 表示要增加的幅度,member 为要更新的用户名,这样每次更新完成,就能把当前用户的权重加上指定的幅度,避免重复抽取或者错过机会。
以上就是Redis 维护权重型集合实现抢购的实现方法,灵活运用Redis的API,可以实现一些具有神奇效果的应用场景。