MySQL中求任务执行批次号[与时间相关]

MySQL中求任务执行批次号[与时间相关]

需求:想产生一个与时间有关的process_id;需要考虑到批次号的不冲突性。例如有很多任务同时执行,这个同时很有可能是在同一毫秒上,所以我们最好使用一个随机数来完成这个需求。

实现一:

select floor(date_format(sysdate(3),'%Y%m%d%H%i%s%f')/1000) + floor(1000 * rand()) as process_id;
这个实现是有问题的,问题出现在加法上,一个time1+rand1很有可能是与time2+rand2相等的。所以不能用加法实现唯一性。取而代之的是拼接。

实现二:

这里采用扩位的方式,即把结果扩大1000倍,在后三位上加上随机数。但是这样的操作会因为bigint的位数不够而”隐式报错”
select floor(date_format(sysdate(3),'%Y%m%d%H%i%s%f')/1000)*1000 + floor(100 * rand()) as process_id;

mysql> select  floor(date_format(sysdate(3),'%Y%m%d%H%i%s%f')/1000)*1000 + floor(100 * rand()) as process_id;
+----------------------+
| process_id                |
+----------------------+
| 20180725172236820000 |
+----------------------+
1 row in set (0.00 sec)

实现三:

最后的实现方式是:select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(100 * rand());
可以用xshell同时执行命令测试一下:

mysql> select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(100 * rand()) as process_id;
+--------------------+
| process_id              |
+--------------------+
| 180725172859527100 |
+--------------------+
1 row in set (0.00 sec)
mysql> select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(100 * rand()) as process_id;
+--------------------+
| process_id              |
+--------------------+
| 180725172859517060 |
+--------------------+
1 row in set (0.00 sec)

可以发现几乎不会雷同。而且大概率情况下还有一个0作为千位。这样的话,可以进一步修改执行命令:select floor(date_format(sysdate(3),'%y%m%d%H%i%s%f')/1000) * 1000 + floor(1000 * rand()) as process_id;

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/81206922
今日推荐