在系統中,爲了區分不一樣的訂單和快速的查閱訂單資料,一般都會按照必定的規則給某一個訂單定一個編號,編號一般是訂單中惟一的,不會有重複的現象。好比說今天是2017年03月09日,接的第8個單,就能夠把此訂單編號爲:20170309008。redis
編號一般是訂單中惟一的,不會有重複的現象。數據庫
訂單編號若是是流水號的話,競爭對手就能夠從訂單號大概推測出大家公司的總體運營狀況。因此訂單編號應該是除了本公司的少數人外,其餘人基本看不懂。安全
若是訂單編號全是使用隨機碼隨機生成(例如UUID),那麼這個編碼自己就是一個沒有意義的數據,對於咱們後續的分析數據一點做用都沒有。
可是採用2~3位隨機碼和流水號混合使用的策略,能夠隱藏流水號的真實數據。併發
好比:業務編碼+時間戳+隨機四位數+全局訂單序列號編碼
訂單編碼的生成方案如今網上不少,主流的就是在數據庫建立一個序列號表(sequence),而後在生成訂單的時候,先使用一個含有事務的存儲過程從sequence表獲取當前訂單號,而後再生成訂單。可是這種方案過於複雜,並且在併發狀況下,事務會影響訂單的生成速度。spa
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; } |