Redis应用之一自增编号

一、前言

前段时间同事用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) 1127.0.0.1:6379> incr ordcd(integer) 2

Redis是IO多路复用单线程模型,一个CPU绑定了一块内存区域,所有客户端的命令都会放入队列,然后逐条执行,所以Redis INCR命令本身是原子性的,它能保证每次返回的结果不会是相同的值,可以做为原子性计数器。

Redis应用之一自增编号_第1张图片

四、SpringBoot整合 Spring-data-redis

Spring-data-redis提供了在Spring应用中通过简单的配置访问redis服务,它对redis底层开发包Jedis进行了高度封装,RedisTemplate提供了对redis的各种操作。

添加依赖

spring-boot-starter-data-redis

application.properties

Redis应用之一自增编号_第2张图片

RedisConfig.java 

Redis应用之一自增编号_第3张图片

注:对Redis的Key进行字符串序列化,解决Key不可识别问题,默认Key是类似"\xac\xed\x00\x05t\x00\x02cd"  这种十六进制的Key。

RedisService.java

Redis应用之一自增编号_第4张图片

然后业务代码中调用RedisService的incr生成自增序列值,不管你是一台机器调用,还是集群环境调用,都能保证返回的值是不会重复的,一般小厂用这个生成自增编码是没问题的。

你可能感兴趣的:(存储,redis,数据库,缓存)