全局递增 独一无二

简介: 【7月更文挑战第9天】

为什么要这样升华呢?因为这段话里,我们很明显的埋下了两颗雷,一个是全局递增,一个是独一无二。也就是说这个亮点方案保证不了这两点,可能会被面试官追问这两个点。

问题:这个方案能够保证主键递增吗?

这个保证不了,但是能够做到大体上是递增的。可以设想,同一时刻如果有两个用户来创建订单,其中用户ID为2345的先创建,用户ID为1234的后创建,很显然用户1234会产生一个比用户2345更小的订单ID;又或者同一时刻一个买家创建了两个订单,但是第三段是随机数,第一次100,第二次99,显然第一次产生的ID更大。
但是这并不妨碍我们认为,随着时间推移,后一时刻产生的ID肯定比前一时刻产生的ID要大。这样一来,虽然性能比不上完全严格递增的主键好,但是比完全随机的主键好。

这个方案不能保证ID唯一,但是这并不是一个很大的问题。
可以想到,不能保证独一无二是因为在第三段里使用了随机数,既然是随机数,就可能随机到同样的数字。但是,产生冲突ID的可能性是很低的。它要求同一时刻同一个用户创建了两个订单,然后订单ID的随机数部分随机到了同一个数字

产生一样ID的概率不是没有,而是极低,他还要求同一个用户在同一时刻创建了两个订单,然后订单ID的随机数部分一模一样,这是一个很低的概率。
在下单场景下,正常的用户都是一个个订单慢慢下,如果同一时刻同时创建两个订单,对于用户来说,是一件不可能的事情。而如果有攻击者下单,那就更加无所谓,失败就失败了。而即使真的由用户因为共享账号之类的问题同一时刻下两个订单,那么随机到同一个数的概率也是十万分之一。(这里的十万分之一,是假设产生的随机数的范围是0到十万)
解决方案也很简单,就是在插入数据的时候,如果返回了主键冲突,就重新产生一个,再次尝试就可以了

还想继续刷亮点的话,可以假装不经意地说:

实际上,还有一种非常偶发性的因素也可能会引起 ID 冲突,也就是时钟回拨,不过相比正统雪花算法,时钟回拨问题在这个方案里面不太严重,毕竟还有一个随机数的部分。

时钟回拨现象指的是系统时钟被调整到之前的时间,这通常发生在服务器或系统时间同步时。在分布式系统中,如果使用基于时间戳生成的主键策略(如雪花算法),时钟回拨可能会导致ID冲突。

目录
相关文章
|
4月前
不使用第三方变量的情况下交换两个数值
不使用第三方变量的情况下交换两个数值
29 1
|
4月前
|
C++
成员初始化表的执行顺序与顺写顺序无关
成员初始化表的执行顺序与顺写顺序无关
45 0
|
3月前
|
存储 数据库
【随手记】顺序I/O和随机I/O的定义和区别
【随手记】顺序I/O和随机I/O的定义和区别
35 1
|
4月前
1207.独一无二的出现次数
1207.独一无二的出现次数
30 2
|
4月前
|
算法 搜索推荐 数据处理
值交换解析法(无第三方变量法)
值交换解析法(无第三方变量法)
36 0
|
4月前
对调 2个变量的值若干种方式
对调 2个变量的值若干种方式
31 0
|
人工智能
一文搞懂候选码、主码、全码、外码、主属性、主键、主关键字、非主属性清晰总结
一文搞懂候选码、主码、全码、外码、主属性、主键、主关键字、非主属性清晰总结
|
安全 Unix vr&ar
一文刨析C/C++全局常量的定义
一文刨析C/C++全局常量的定义
运算符优先顺序(包含类型说明)
运算符优先顺序(包含类型说明)
166 0
运算符优先顺序(包含类型说明)
循环的差异性记录
循环的差异性记录循环的差异性记录