背景: 訂單需要一個不重覆且加密的的訂單號,而且訂單號不能太長!加密說白了就是不想讓任何人從訂單號中看出來今天產生了多少個訂單。訂單號要不重覆且不太長,那就只能是日期+流水號。但是,流水號顯然不能符合加密的需求。所以,流水號就需要加密了。 最初的想法: 初始化一個順序序列的map,然後隨機取出一個數 ...
背景:
訂單需要一個不重覆且加密的的訂單號,而且訂單號不能太長!加密說白了就是不想讓任何人從訂單號中看出來今天產生了多少個訂單。訂單號要不重覆且不太長,那就只能是日期+流水號。但是,流水號顯然不能符合加密的需求。所以,流水號就需要加密了。
最初的想法:
初始化一個順序序列的map,然後隨機取出一個數放到一個棧裡面並刪除map裡面的元素,直到把map取空為止。這樣,就得到了一個包含完全正態分佈的隨機數序列的棧。生成一個訂單就從棧裡面彈出一個作為流水號。這個方案在持久化上比較難處理,所以最終被放棄了。至於為什麼要持久化,其實很簡單,你總不能指望這個系統永遠正常工作吧?一旦重啟,就可能產生重覆的流水號。
進一步的優化:
初始化一個順序序列的map,然後隨機取出一個數放到一個迴圈鏈表裡面並刪除map裡面的元素,直到把map取空為止。這個方案的好處是可以用較低的成本進行初始化和持久化。因為這個序列可以迴圈使用,所以只需要保存一次序列就可以了。使用的時候,只要取出下一個節點的值作為流水號,然後每過1000個節點保存一次當前節點,服務重啟後取保存的當前節點後1000個節點作為當前節點,就不虞流水重覆了。