ThreadLocal源码分析-黄金分割数的使用 - 腾讯云开发者社区-腾讯云
https://www.cnblogs.com/xiaozhongfeixiang/archive/2019/09/23/11571902.html
keyIndex = ((i + 1) * HASH_INCREMENT) & (length - 1)
// length 取2^n 比较好
// i+1的目的是 避免了每次0都在位置0上,如果length不同,0不一定每次都在0这个索引上 我猜测是这样
位运算比除法快
假设有两个数,A和B(A>0,B>0)。B为2^n,期中n>=0,A>=0。则:(原来B得为2^n)
要求A * B的话,则可使用<<操作符,A << n。
要求A / B的话,则可使用>>操作符,A >> n。
要求A % B的话,则可使用&操作符,A&(B-1)。
设计模式之什么是状态模式 - 知乎
秒懂设计模式之状态模式(State Pattern) - 知乎
重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」
雪花算法SnowFlake—利用hutool生成分布式订单唯一流水号和ID - 零一开源—技术|科技|资源分享
// 0 ~ 31 位,可以采用配置的方式使用
long workerId;
try {
workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());
} catch (Exception e) {
workerId = NetUtil.getLocalhostStr().hashCode();
}
// 只保留后5位
workerId = workerId >> 16 & 31;
long dataCenterId = 1L;
snowflake = IdUtil.createSnowflake(workerId, dataCenterId);
// 生成雪花ID
snowflake.nextId();
// UUID
//生成的UUID是带-的字符串,类似于:a5c8a5e8-df2b-4706-bea4-08d0939410e3
String uuid = IdUtil.randomUUID();
//生成的是不带-的字符串,类似于:b17f24ff026d40949c85a24f4f375d42
String simpleUUID = IdUtil.simpleUUID();
//ObjectId
//生成类似:5b9e306a4df4f8c54a39fb0c
String id = ObjectId.next();
//方法2:从Hutool-4.1.14开始提供
String id2 = IdUtil.objectId();
//Snowflake
//参数1为终端ID
//参数2为数据中心ID
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId();
HashMap扰动函数解读_supercmd的博客-CSDN博客
BeanUtils介绍及使用
Java Matcher replaceAll(String)用法及代码示例 - 纯净天空
1>抽奖逻辑设计
把活动和网购进行类比,中间加一层类似于订单信息的东西,也就是该项目中的user_take_active表抽奖单
提供一层领取活动,可以生成抽奖单。如果一次抽奖执行失败,这个抽奖单也可以发起重试。
类似于你在商城下单到支付发货,这个是活动下单,执行抽奖,奖品发货。
2>防止刷新浏览器持续请求,或者羊毛同时1s多次请求
在抽奖单里,加个state状态位,每次先看是否有没有进行抽奖的抽奖单,如果有的话就取出来进行抽奖,这样就算一个人同时好多次请求进来,也会取到同一个抽奖单,抽奖单和最后抽奖结果分离的好处
3.id的生成选择
雪花算法,长码,大量 日期算法,短码,少量,全局唯一需要自己保证 随机算法,短码,大量,全局唯一需要自己保证
1.雪花算法,用于生成单号 2. 日期算法,用于生成活动编号类,特性是生成数字串较短,但指定时间内不能生成太多
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int week = calendar.get(Calendar.WEEK_OF_YEAR);
int day = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR_OF_DAY);
// 打乱排序:2020年为准 + 小时 + 周期 + 日 + 三位随机数
StringBuilder idStr = new StringBuilder();
idStr.append(year - 2020);
idStr.append(hour);
idStr.append(String.format("%02d", week));
idStr.append(day);
idStr.append(String.format("%03d", new Random().nextInt(1000)));
return Long.parseLong(idStr.toString());
3. 随机算法,用于生成策略ID 阿帕奇工具包 RandomStringUtils