基于自己的一个楚币来分享楚币红包供别人领取。
1、创建楚币
注意细节:①设定创建楚币的数量,即抢红包的人数,一般不要太多;
②原始优惠券的信息,比如这里是无条件券可以分享多人,满减券||退款补偿券(且支持分享)的情况,仅限单人分享,当前优惠券未使用;
③分享楚币面额限定,如果是按整元处理,判断一下总额度;
④创建楚币的基础信息入库存储,根据拆分红包的类型拆分金额。比如有普通红包均分的,拼手气红包随机分的;
⑤如果领取红包的并发很高,这里可以在创建楚币的时候就按规则分配好楚币,分别存储在redis和db中,这样领取的时候直接选择一个即可;
⑥创建楚币信息redis用hMset 拆分领取楚币列表用zAdd 领取楚币数量用自增set一个最大值,然后decr;
⑦还需要注意一点就是异常机制,例如先入库再入redis,中途可能某一环节出错,因此需要多次查询判断。先查询数据库看当前优惠券是否创建过楚币,没创建过就创建,如果有取出唯一标识$coinSn = md5($couponInfo['couponUser']['couponSn']).'_'.$uid.'_'.$couponInfo['couponTemp']['startTime'];
,
然后查看是否有拆分记录,有取出,没有插入。然后楚币基础信息入hash,拆分列表入zadd以及领取数量。
2、分享楚币,基于创建楚币后的唯一标识coinSn来再次分享给他人进行领取。根据coinSn查询redis是否有楚币信息,没有则查库来hash插入,再查看是否有拆分列表记录,没有则查库插入。领取数量也同理判断一下。(分享还是基于用一份创建的coinSn,另外判断一下分享的有效期和过期时间)
3、领取楚币。判断当前人是否领取过,获取楚币基础信息,分享人和领取人不可以是同一人,领取时间是否在有效期(领取有效时间,优惠结束时间等)。领取基于领取数量decr得到的数,到集合中取相应位置的值,$location = $this->_redis->decr($key);$this->_redis->zRange('coin_split_list_'.$coinSn,$location,$location,true);
,
然后将领取信息存入领取明细集合,入redis(zadd集合 可以按领取时间排序) 入库(领取明细记录),修改领取总人数。 进行发币(发优惠券等操作)
4、以上过程的redis数据 需要合理的设置expire过期时间。过期后查库即可。
网友评论