生成订单号

生成订单号

/**
 * 生成11位订单号,日期占6位 + 5位0~100000之间的不重复随机数,例如:21031403607
 *
 */
public class RandomNumbers {

    private static final Jedis jedis;

    static {
        System.out.println(1);
        //连接redis
        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379, null, "root");
        jedis = jedisPool.getResource();
        //当天不更新,方便调试时不会出现重复订单号
        String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
        if (!today.equals(jedis.get("randomNumbers:today"))) {
            //存入今天日期
            jedis.set("randomNumbers:today", today);
            jedis.persist("randomNumbers:today");
            //初始化计数器
            jedis.set("randomNumbers:counter", "-1");
            jedis.persist("counter");

            List<String> numberList = new ArrayList<>();
            for (int i = 0; i < 100000; i++) {
                numberList.add(String.valueOf(i));
            }
            //乱序
            Collections.shuffle(numberList);

            for (int i = 0; i < 100; i++) {
                List<String> list = numberList.subList(i * 1000, (i + 1) * 1000);
                //清空已存在的列表
                jedis.del("randomNumbers:" + i);
                jedis.rpush("randomNumbers:" + i, list.toArray(new String[0]));
                //永不过期
                jedis.persist("randomNumbers:" + i);
            }
        }


    }

    public static String createOrder() {
        //获取索引
        long index = jedis.incr("randomNumbers:counter") % 100000;
        //查询字段
        StringBuilder number = new StringBuilder(jedis.lindex("randomNumbers:" + index / 1000, index % 1000));
        int MissingLenth = 5 - number.length();
        for (int i = 0; i < MissingLenth; i++) {
            number.insert(0, "0");
        }
        return new SimpleDateFormat("yyyyMMdd").format(new Date()).substring(2) + number;
    }

    //测试bug
    @Test
    public void testBug() {
        List<String> list = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            String order = createOrder();
            if (order.length() != 11) {
                System.out.println(order);
                throw new RuntimeException("订单号长度有bug");
            }
            if (list.contains(order)) {
                System.out.println(order);
                throw new RuntimeException("订单号重复出现!");
            } else {
                list.add(order);
            }
        }
    }

    //测试性能
    @Test
    public void testSpeed() {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            createOrder();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("平均每个订单号生成耗时" + (endTime - startTime) / 100000.0 + "ms");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值