訂單編號生成策略

1 前言

在系統中,爲了區分不一樣的訂單和快速的查閱訂單資料,一般都會按照必定的規則給某一個訂單定一個編號,編號一般是訂單中惟一的,不會有重複的現象。好比說今天是2017年03月09日,接的第8個單,就能夠把此訂單編號爲:20170309008。redis

2 訂單編號規範

2.1 惟一性

編號一般是訂單中惟一的,不會有重複的現象。數據庫

2.2 安全性

訂單編號若是是流水號的話,競爭對手就能夠從訂單號大概推測出大家公司的總體運營狀況。因此訂單編號應該是除了本公司的少數人外,其餘人基本看不懂。安全

2.3 不能使用大規模隨機碼

若是訂單編號全是使用隨機碼隨機生成(例如UUID),那麼這個編碼自己就是一個沒有意義的數據,對於咱們後續的分析數據一點做用都沒有。
可是採用2~3位隨機碼和流水號混合使用的策略,能夠隱藏流水號的真實數據。併發

2.4 訂單編號命名規則

好比:業務編碼+時間戳+隨機四位數+全局訂單序列號編碼

3 訂單編號的生成

3.1 傳統方案

訂單編碼的生成方案如今網上不少,主流的就是在數據庫建立一個序列號表(sequence),而後在生成訂單的時候,先使用一個含有事務的存儲過程從sequence表獲取當前訂單號,而後再生成訂單。可是這種方案過於複雜,並且在併發狀況下,事務會影響訂單的生成速度。spa

3.2 Redis方案

Redis命令的原子性使得咱們不用考慮併發問題,能夠方便的利用原子性自增操做INCR實現簡單計數器功能;事務

    //自增     public Object getIncrValue(final String key){         ValueOperations<String, String> valueOper=redisTemplate.opsForValue();           redisTemplate.setValueSerializer(new StringRedisSerializer());         Object value = valueOper.increment(key,1);         return value;     }          //zSet     public void zSet(final String key,final Object value,Double score){         redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());         ZSetOperations zSetOperations = redisTemplate.opsForZSet();           zSetOperations.add(key, value, score);     }          //取出Zset     public Set zRange(final String key){         redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());         ZSetOperations zSetOperations = redisTemplate.opsForZSet();                    Set result = null;         try {             result = zSetOperations.range(key, 0, zSetOperations.size(key));         } catch (Exception e) {             result = null;             e.printStackTrace();         }         return result;     }
相關文章
相關標籤/搜索