在Redis中,Set(集合) 自身具备“去重”的特性,非常适合用来实现“保证每个人只能中奖一次”。但是,Redis的原生 Set 并不支持“权重”概念(它里面的元素是无序且平权的)。 要同时实现这两个需求,业界通常有两种方案。第一种是“奖池预分配法”(充分利用Set),第二种是“代码权重计算+Redis Lua原子扣减”(最主流、最灵活)。 下面为你详细拆解这两种实现方案。 --- 方案一:奖池预分配法(纯Redis Set实现,适合库存有限的抽奖) 这个方案的核心思路是:用数量来代替权重。既然Set不能设权重,那我们就把奖品按权重比例生成唯一凭证,全部扔进一个 Set 里。 1. 初始化奖池(模拟权重) 假设有三种奖品,权重/库存如下:一等奖1个,二等奖2个,未中奖(阳光普照)7个。 我们在 Redis 中通过加入带编号的元素来保证唯一性,存入名为 的 Set 中: 此时, 被抽中的概率是 10%, 是 20%,未中奖是 70%。 2. 用户抽奖流程 我们需要另一个 Set 来记录已经中过奖的用户:。 当用户(假设ID为 )来抽奖时,执行以下逻辑: 1. 检查是否已参与/中奖...