加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Java技术干货分享:浅谈订单号生成设计方案

发布时间:2019-08-15 22:40:09 所属栏目:优化 来源:IT技术分享
导读:最简单的方式 基于数据库 auto_increment_increment 来获取 ID。首先在数据库中创建一张 sequence 表,其中 seq_name 用以区分不同业务标识,从而实现支持多种业务场景下的自增 ID, current_value 为当前值, _increment 为步长,可支持分布式数据库的哈

代码的实现稍微复杂一点,获取 ID 会根据业务标识 sequencename,先从内存获取 Step 的 ID 段,如果为 null,则从数据库中读取当前最新的值,并根据步长计算 Step,然后返回请求 ID。如果从内存中直接获取到 Step,则直接取 ID,并对 currentValue 进行加一。当 currentValue 的值超过 endValue 时,则更新数据库的 ID,重新计算 Step。

  1. private Map<String,Step> stepMap = new HashMap<String, Step>();  
  2. public synchronized long get(String sequenceName) {  
  3. Step step = stepMap.get(sequenceName);  
  4. if(step ==null) {  
  5. step = new Step(startValue,startValue+blockSize);  
  6. stepMap.put(sequenceName, step);  
  7. } else { 
  8. if (step.currentValue < step.endValue) {  
  9. return step.incrementAndGet();  
  10. }  
  11. if (getNextBlock(sequenceName,step)) {  
  12. return step.incrementAndGet();  
  13. }  
  14. throw new RuntimeException("No more value.");  
  15. }  
  16. private boolean getNextBlock(String sequenceName, Step step) {  
  17. // "select id from sequence_value where name = ?";  
  18. Long value = getPersistenceValue(sequenceName);  
  19. if (value == null) { 
  20. try {  
  21. // insert into sequence_value (id,name) values (?,?)  
  22. value = newPersistenceValue(sequenceName);  
  23. } catch (Exception e) {  
  24. value = getPersistenceValue(sequenceName);  
  25. }  
  26. }  
  27. // update sequence_value set id = ? where name = ? and id = ?  
  28. boolean b = saveValue(value,sequenceName) == 1;  
  29. if (b) {  
  30. step.setCurrentValue(value);  
  31. step.setEndValue(value+blockSize); 
  32. }  
  33. return b;  

使用该方法获取 ID 可以减少对数据库的访问量,以降低数据库的压力,但是同样需要注意,获取 ID 同样关注数据库事务问题,因为当系统重启的时候,stepMap 为 null,所以会取数据库查询当前 ID,更计算更新 Step,然后更新数据库的 ID。如果该方法被放到数据库事务里,由于其他方法性能慢了,导致查询之后没有及时更新,并发情况下另一个线程查询的时候,可能会获取到该线程未提交的 ID,因而出现两个线程获取到相同的 ID 问题。

本文小结

订单号生成是一个非常简单的功能,但是在高并发的场景下,高性能和高可用就成为了需要关注的要点。所以,实际工作中的每一个小细节都值得我们去深思。

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读