订单编号生成策略

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;     }
相关文章
相关标签/搜索