一个简单的基于Redis实现抢红包功能,分为两个步骤:

1、拆分红包

/**

* 拆红包 1、红包金额要被全部拆分完 2、红包金额不能差的太离谱

*

* @param total

* @param count

* @return

*/

public static int[] SplitRedPacket(int total, int count) {

int use = 0;

int[] array = new int[count];

Random random = new Random();

for (int i = 0; i < count; i++) {

if (i == count - 1)

array[i] = total - use;

else {

int avg = (total - use) * 2 / (count - i);// 2 红包随机金额浮动系数

array[i] = 1 + random.nextInt(avg - 1);

}

use = use + array[i];

}

return array;

}

2、保存红包

/**

* 存红包 采用redis的list结构

*

* @param packetId

* @param packets

*/

public static void SaveRedPacket(String packetId, int[] packets) {

RedisClient redisClient = RedisClient.create("redis://127.0.0.1:6379/0");

StatefulRedisConnection connection = redisClient.connect();

RedisCommands syncCommands = connection.sync();

for (int packet : packets) {

syncCommands.lpush("Packet:" + packetId, packet + "");

}

connection.close();

redisClient.shutdown();

}

3、抢红包

/**

* 抢红包

*

* @param packetId

*/

public static void GrabRedPacket(String packetId) {

RedisClient redisClient = RedisClient.create("redis://127.0.0.1:6379/0");

StatefulRedisConnection connection = redisClient.connect();

RedisCommands syncCommands = connection.sync();

String res = syncCommands.lpop("Packet:" + packetId);

System.out.println("抢到红包:" + res);

connection.close();

redisClient.shutdown();

}

最后完整测试demo如下:

public static void main(String[] args) {

final String packetId = UUID.randomUUID().toString();

// 红包金额(以分为单位,无精度损失问题)

int total = 2000;

// 红包数量

int count = 7;

// 拆红包

int[] packets = SplitRedPacket(total, count);

// 存红包

SaveRedPacket(packetId, packets);

// 抢红包

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

for (int i = 0; i < 20; i++) {

cachedThreadPool.execute(new Runnable() {

public void run() {

GrabRedPacket(packetId);

}

});

}

}

测试结果:

java发红包redis_基于Redis实现类似微信抢红包相关推荐

  1. 朋友圈点赞发红包视频的播放Pc端微信加群app端微信加群 测试用例的设计点

    1.朋友圈点赞用例的设计点 功能 (1)点赞是否实时显示结果 (2)点赞后显示的是否是自己的昵称 (3)点赞后是否可以取消 (4)取消后,重新点赞 (5)点赞后,其他共同好友点赞,是否有消息提醒 (6 ...

  2. java发红包课程设计_JAVA 实现简单的发红包案例

    1 package Demo511; 2 3 import java.util.ArrayList; 4 5 public class DemoSend { 6 public static void ...

  3. 电商库存设计mysql redis_基于redis实现的扣减库存

    在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段. 还是使用数据库, ...

  4. Java发红包案例(继承关系的应用)

    最大的父类(user) package Demo11;public class User {private String name;public String getName() {return na ...

  5. java 缓存分页_基于redis做缓存分页

    在实际业务中我们会将一些热数据缓存到redis里面,这时候数据量比较大的话,我们就要对这些热数据进行分页,分页的方式有2种: 第一:从redis拿出所有数据后,再做内存分页(不推荐),热点数据小的时候 ...

  6. 红包 java_利用java发红包(1)之红包分配方法

    红包发放: 涉及继承: 一共三个类: user mannger member 其中后两个类继承user类 其中mannger需要的方法是send(发红包) 发红包有两种常见的方法借用Arraylist ...

  7. python 发红包import random用redenv,Python微信发红包编码案例 微信发红包的架构模式 - push博客...

    Python手机微信红包优化算法案例 #!/usr/bin/env python # coding: utf-8 import random # m : 红包个数 # n : 红包人数 # packe ...

  8. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的...

    最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想到两个方法. 之前公众号开发一直用了的.一个是红包接口,一个是企业支付接口.一开 ...

  9. 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的

    本文转载自: https://www.cnblogs.com/xinweiyun/p/7667595.html 作者:xinweiyun 转载请注明该声明. 最近公司在开发一个小程序红包系统,客户抢到 ...

最新文章

  1. 2021年大数据Flink(二十):案例二 基于数量的滚动和滑动窗口
  2. 在GridView内访问特定控件
  3. 收藏 | 一文洞悉Python必备50种算法(附解析)
  4. python代码命令行tab补齐_Python在命令行下Tab键自动补全脚本
  5. 网站输入正确账号密码页面刷新一下_Folx的密码管理保存网站登陆信息
  6. ubuntu 12.04 开启root
  7. JavaFX 架构与框架 (译)
  8. 2个字符串相等 swift_Swift快速入门(一)之 Swift基础语法
  9. [BZOJ 3260] 跳
  10. 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
  11. 管理表空间和数据文件——建立表空间——建立字典管理表空间和建立加密表空间...
  12. Spark读写HBase(主要讲解SHC的使用)
  13. Android9输入法留白配置,拇指于键盘间游离 2015安卓输入法横评
  14. 贪心科技分布式高性能深度实战学习笔记
  15. 酷睿i7 11800h相当于什么水平 i711800h属于哪个档次
  16. [动态规划]基因序列相似性问题
  17. Mac环境安装imagemagick及使用imagemagick拼接图片
  18. 计算两个日期之间所间隔天数的快速算法
  19. php更改后缀名,修改网页后缀名
  20. Ajax 是什么? 如何创建一个 Ajax?

热门文章

  1. 2020市政方向-通用基础(质量员)证考试及市政方向-通用基础(质量员)作业模拟考试
  2. 西门子smart200能用C语言吗,【项目详解】200SMART+V20在收卷机械上的应用
  3. matlab的dpsk,基于matlab的dpsk系统仿真代码
  4. 【干货】大数据创新驱动智慧民生
  5. mq Too many publishes in progress
  6. mapStruct——VO-DO工具
  7. 【C#】台站值班客户端挂机程序
  8. Altium Designer 原理图检查总结
  9. Google的中文名竟然取名“谷歌”
  10. echarts 地图去除点击事件_echarts 地图 鼠标移出地图后的事件要怎么写