java发红包redis_基于Redis实现类似微信抢红包
一个简单的基于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实现类似微信抢红包相关推荐
- 朋友圈点赞发红包视频的播放Pc端微信加群app端微信加群 测试用例的设计点
1.朋友圈点赞用例的设计点 功能 (1)点赞是否实时显示结果 (2)点赞后显示的是否是自己的昵称 (3)点赞后是否可以取消 (4)取消后,重新点赞 (5)点赞后,其他共同好友点赞,是否有消息提醒 (6 ...
- java发红包课程设计_JAVA 实现简单的发红包案例
1 package Demo511; 2 3 import java.util.ArrayList; 4 5 public class DemoSend { 6 public static void ...
- 电商库存设计mysql redis_基于redis实现的扣减库存
在日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等. 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存去更新这个字段. 还是使用数据库, ...
- Java发红包案例(继承关系的应用)
最大的父类(user) package Demo11;public class User {private String name;public String getName() {return na ...
- java 缓存分页_基于redis做缓存分页
在实际业务中我们会将一些热数据缓存到redis里面,这时候数据量比较大的话,我们就要对这些热数据进行分页,分页的方式有2种: 第一:从redis拿出所有数据后,再做内存分页(不推荐),热点数据小的时候 ...
- 红包 java_利用java发红包(1)之红包分配方法
红包发放: 涉及继承: 一共三个类: user mannger member 其中后两个类继承user类 其中mannger需要的方法是send(发红包) 发红包有两种常见的方法借用Arraylist ...
- python 发红包import random用redenv,Python微信发红包编码案例 微信发红包的架构模式 - push博客...
Python手机微信红包优化算法案例 #!/usr/bin/env python # coding: utf-8 import random # m : 红包个数 # n : 红包人数 # packe ...
- 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的...
最近公司在开发一个小程序红包系统,客户抢到红包需要提现.也就是通过小程序来给用户发红包. 小程序如何来发红包呢?于是我想到两个方法. 之前公众号开发一直用了的.一个是红包接口,一个是企业支付接口.一开 ...
- 微信小程序红包开发 小程序发红包 开发过程中遇到的坑 微信小程序红包接口的
本文转载自: https://www.cnblogs.com/xinweiyun/p/7667595.html 作者:xinweiyun 转载请注明该声明. 最近公司在开发一个小程序红包系统,客户抢到 ...
最新文章
- 2021年大数据Flink(二十):案例二 基于数量的滚动和滑动窗口
- 在GridView内访问特定控件
- 收藏 | 一文洞悉Python必备50种算法(附解析)
- python代码命令行tab补齐_Python在命令行下Tab键自动补全脚本
- 网站输入正确账号密码页面刷新一下_Folx的密码管理保存网站登陆信息
- ubuntu 12.04 开启root
- JavaFX 架构与框架 (译)
- 2个字符串相等 swift_Swift快速入门(一)之 Swift基础语法
- [BZOJ 3260] 跳
- 【转】基于Ubuntu 14.04 LTS编译Android4.4.2源代码
- 管理表空间和数据文件——建立表空间——建立字典管理表空间和建立加密表空间...
- Spark读写HBase(主要讲解SHC的使用)
- Android9输入法留白配置,拇指于键盘间游离 2015安卓输入法横评
- 贪心科技分布式高性能深度实战学习笔记
- 酷睿i7 11800h相当于什么水平 i711800h属于哪个档次
- [动态规划]基因序列相似性问题
- Mac环境安装imagemagick及使用imagemagick拼接图片
- 计算两个日期之间所间隔天数的快速算法
- php更改后缀名,修改网页后缀名
- Ajax 是什么? 如何创建一个 Ajax?
热门文章
- 2020市政方向-通用基础(质量员)证考试及市政方向-通用基础(质量员)作业模拟考试
- 西门子smart200能用C语言吗,【项目详解】200SMART+V20在收卷机械上的应用
- matlab的dpsk,基于matlab的dpsk系统仿真代码
- 【干货】大数据创新驱动智慧民生
- mq Too many publishes in progress
- mapStruct——VO-DO工具
- 【C#】台站值班客户端挂机程序
- Altium Designer 原理图检查总结
- Google的中文名竟然取名“谷歌”
- echarts 地图去除点击事件_echarts 地图 鼠标移出地图后的事件要怎么写