唯一码,也许在开发中不常用,但是一旦用上往往会出现在核心业务里面。例如订单号,邀请码,会员卡号,消息id等等。
草稿方案
1.最简单方案,以年月日时分秒+几位随机数
2.如果唯一码有长度限制那就尴尬了,例如只允许5位,这个时候降低生成唯一码重复率就十分重要了。
生成策略
1.预生成策略,这种策略优势在于0重复率,特别适合短唯一码,但是预先生成就意味着占用空间。
2.实时生成策略,这种策略在于节省存储空间,但是必须使用一些经过优化的算法来生成唯一码。
如何保证生成是唯一的呢?
最简单的的,生成之后保存下来,下次生成判断一下是否存在即可。但是在并发请求下就需要加锁处理了。所以保险起见还是用单进程单线程吧。
如果你真的要在并发下生成,可以考虑利用一下数据库,用唯一值约束检验一下。性能那就没办法保证了。
如果使用预分配策略的话,只需要内部维护一个计数器,每次请求计数器加一,然后作为下标拿分配的唯一码就好。计数器如何维护呢,单进程单线程下程序一个变量作为计数器即可。并发情况下可以考略redis的队列,push方法可以拿到长度,或者使用数据库的自增主键。
一些个人实验过或者猜想过或者听说过的方案
1.简单随机生成,依靠数据库唯一约束,失败则重复生成
2.预分配几百万个唯一码,依靠数据库自增主键作为下标获取
3.构造一个唯一的URL,然后调用第三方的短网址生成,后面那部分可是唯一的。