在系统中,为了区分不一样的订单和快速的查阅订单资料,一般都会按照必定的规则给某一个订单定一个编号,编号一般是订单中惟一的,不会有重复的现象。好比说今天是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; } |