QQ图片20191105112908.jpg

    QQ图片20191105113337.jpg

    1、UUID

    QQ图片20191105112837.jpg

    UUID可以应用在Token生成和数据库主键生成上

    2、数据库自增方式

    QQ图片20191105113626.jpg

    如果数据库是集群的时候会出现问题:
    可以应用读写分离,可是这样在数据库写的效率会降低;
    可以应用设置步长的方式来解决;可是这样也有缺点,就是一旦设定步长,后期无法再扩展;(ElasticSearch)
    QQ图片20191105115138.jpg

    QQ图片20191105115150.jpg

    3、基于Redis实现

    当前日期 + 5位自增id(根据一毫秒中的订单数最大值来确定)
    redis先天性高并发安全,因为单线程
    一般来说都是先生成订单号存放子redis中,用的时候直接去取就好了(当redis中的订单号少去某个阈值的时候就开始再次生成定量订单号放置于redis中)

    考虑在应用主从复制的redis集群中,应该考虑到唯一ID的问题,也应该应用设置步长来解决

    考虑失效时间问题 建议设置为24h

    1. package com.mayikt;
    2. import java.text.SimpleDateFormat;
    3. import java.util.Date;
    4. import java.util.concurrent.TimeUnit;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.data.redis.core.RedisTemplate;
    7. import org.springframework.data.redis.support.atomic.RedisAtomicLong;
    8. import org.springframework.web.bind.annotation.RequestMapping;
    9. import org.springframework.web.bind.annotation.RestController;
    10. @RestController
    11. public class OrderController {
    12. @Autowired
    13. private RedisTemplate redisTemplate;
    14. @RequestMapping("/order")
    15. public String order(String key, Long timeOut) {
    16. RedisAtomicLong redisAtomicLong = new RedisAtomicLong(key, redisTemplate.getConnectionFactory());
    17. redisAtomicLong.set(1);
    18. // 设置redis步长增长为2
    19. redisAtomicLong.addAndGet(1);
    20. // for (int i = 0; i < 100; i++) {
    21. long andIncrement = redisAtomicLong.getAndIncrement();
    22. String orderId = prefix() + String.format("%1$05d", andIncrement);
    23. String insertSQL = "insert into orderNumber value('" + orderId + "');";
    24. // System.out.println(Thread.currentThread().getName() +
    25. // ",insertSQL:" + insertSQL);
    26. System.out.println(insertSQL);
    27. if ((null == redisAtomicLong || redisAtomicLong.longValue() == 0) && timeOut > 0) {// 初始设置过期时间
    28. redisAtomicLong.expire(timeOut, TimeUnit.SECONDS);
    29. }
    30. // }
    31. return "success";
    32. }
    33. public static String prefix() {
    34. String temp_str = "";
    35. Date dt = new Date();
    36. // 最后的aa表示“上午”或“下午” HH表示24小时制 如果换成hh表示12小时制
    37. SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
    38. temp_str = sdf.format(dt);
    39. return temp_str;
    40. }
    41. public static void main(String[] args) {
    42. System.out.println(prefix());
    43. }
    44. }

    4、基于雪花算法

    QQ图片20191105124124.jpg

    QQ图片20191105124625.jpg

    资料部分.zip

    UUID与雪花算法都是不占用宽带的;而数据库自增与redis实现都是需要占用宽带的;