手记

springboot+redis 实现抢红包功能

随机生成红包金额

思路:1. 红包总金额、红包总数通过参数传递;
2. 红包最小金额可配置
3. 每次算出一个最大红包金额的上限,保证每次分配红包金额不大于最大金额,不小于最小金额
4. 如果剩余最后2个名额,保证最后两个人的红包总额不超过剩余金额

  • 生成红包
/**
     * 拆分红包
     * @param money 红包总金额
     * @param count 红包总数
     * @return List
     */
    public List makeRedPacket(double money, int count) {
        //红包的最小金额
        double min = RedisConstant.RED_PACKET_MIN_MONEY;
        //红包的最大金额
        double max;
        //每个红包的金额
        double account;
        DecimalFormat decimalFormat = new DecimalFormat("###.##");
        List arrayList = new ArrayList();
        int i = 1;
        while (i < count) {
           //保障最大红包已出现,后面剩下的红包金额也不会小于最小金额
            max = money - min * (count - i);
            //保证最后两个人拿的红包不超出剩余金额
            int k = (int) (count - i) / 2;
            if (count - i <= 2) {
                k = count - i;
            }
            //最大的红包限定的平均线
            max /= k;
            //保证每个红包大于最小值,又不会大于最大值
            account = (int) (min * 100 + Math.random() * (max * 100 - min * 100 + 1));
            account = Double.parseDouble(decimalFormat.format(account/100));
            money = (int)(money*100 - account*100);
            money = money/100;
            arrayList.add(account);
            i++;
            //最后一个人拿走剩下的红包
            if (i == count) {
                arrayList.add(money);
            }
        }
        return arrayList;
    }
  • 保存生成红包信息
/**
     * 红包拆分
     * @param money 红包金额
     * @param count 红包总数
     * @return AjaxUtil
     */
    @Override
    public AjaxUtil makeRedPacket(double money, int count) {
        Long uniqueId = uniqueId();
        String key = RedisConstant.RED_PACKET_KEY + uniqueId;
        List redPacket = redPacketUtil.makeRedPacket(money, count);
        redisTemplate.opsForList().leftPushAll(key, redPacket);
        //红包中最大的
        double max = (double) Collections.max(redPacket);
        redisTemplate.opsForHash().put(RedisConstant.RED_PACKET_CONSUMER + uniqueId, "max_red_packet", max);
        redisTemplate.opsForHash().put(RedisConstant.RED_PACKET_CONSUMER + uniqueId, "size", count);
        redisTemplate.expire(key, 3, TimeUnit.HOURS);
        logger.info("红包拆分信息:{}=>{}", key, redPacket);
        return AjaxUtil.success();
    }

效果:

  1. 创建红包



2. 抢红包

  1. 红包信息


2人推荐
随时随地看视频
慕课网APP