一、前言
前段时间同事用Redis实现收银台商品排行榜,我们都知道Redis最基础的功能是用来缓存数据,但其实它还有很多特性能解决很多实际问题,接下来几篇文章我们就聊聊Reids一些特性的应用,今天先聊一下借助Reids生成不会重复的订单编号。
二、订单编号
订单编号例子
-
淘宝订单编号 827768001755267512 ,共18位,其中最后6位是不变的,这个订单编码变更过几次,现在具体规则我也不太清楚,原来和淘宝的商品中心打过一些交道,好像还下载代码,不管是表结构还是代码架构扩展性做得很好,不像商品发布Shell平台那么乱。
-
公司牛奶订单编号 211118105409550001,生成规则yyMMddHHmmssSSS+3位的自增值。开始做的时候最后3位是用随机数生成的,当时还发生过重复的问题,后面才改成用Redis自增值解决,然而我们订单很少大多数订单最后三位都是001,把这个订单推到顺丰WMS里人家还很奇怪。
-
公司窗帘订单编号 IN0480012,CR0406344等,两位的业务类型编码+自增值,然后小票上根据这个编号生成条形码 ,对条形码感兴趣的请看 扫码枪的那些事。
订单编号设计规则
-
订单编码要保证绝对不能重复
-
订单编码的长度要尽量保持较短,方便用户客服,不过我们客户打400进来时,呼叫中心会快速定位到客户未完成订单, 如何给企业搭建呼叫中心。
-
订单编码尽量保证是纯整数,避免字母+数字格式,长整数的索引效率要远高于文本。
三、Redis的INCR
Ubuntu一键安装redis
apt-get install redis-server
记得修改redis.conf 设置 requirepass,不然几分钟就会被黑了做挖矿机,请看 Redis被攻击纪实
INCR key:将key中的数值加1(注:INCRBY 可设置步长 ),如果KEY不存在会先初始化为0然后执行INCR
127.0.0.1:6379> incr ordcd
(integer) 1
127.0.0.1:6379> incr ordcd
(integer) 2
Redis是IO多路复用单线程模型,一个CPU绑定了一块内存区域,所有客户端的命令都会放入队列,然后逐条执行,所以Redis INCR命令本身是原子性的,它能保证每次返回的结果不会是相同的值,可以做为原子性计数器。
四、SpringBoot整合 Spring-data-redis
Spring-data-redis提供了在Spring应用中通过简单的配置访问redis服务,它对redis底层开发包Jedis进行了高度封装,RedisTemplate提供了对redis的各种操作。
添加依赖
spring-boot-starter-data-redis
application.properties
RedisConfig.java
注:对Redis的Key进行字符串序列化,解决Key不可识别问题,默认Key是类似"\xac\xed\x00\x05t\x00\x02cd" 这种十六进制的Key。
RedisService.java
然后业务代码中调用RedisService的incr生成自增序列值,不管你是一台机器调用,还是集群环境调用,都能保证返回的值是不会重复的,一般小厂用这个生成自增编码是没问题的。