Lottery项目学习

1.斐波那契数列

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这个索引上 我猜测是这样

2.为什么大小设置为2^n-1比较好: 

位运算比除法快

假设有两个数,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)。

3.状态模式

设计模式之什么是状态模式 - 知乎

秒懂设计模式之状态模式(State Pattern) - 知乎

4.策略模式

重学 Java 设计模式:实战策略模式「模拟多种营销类型优惠券,折扣金额计算策略场景」

5.雪花算法

雪花算法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();

6.扰动函数

HashMap扰动函数解读_supercmd的博客-CSDN博客

7.BeansUtil的使用

BeanUtils介绍及使用

8.正则表达式的使用

Java Matcher replaceAll(String)用法及代码示例 - 纯净天空

9.业务逻辑

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

你可能感兴趣的:(DDD,学习)