如何在高并发分布式系统中生成全局唯一Id

如何在高并发分布式系统中生成全局唯一Id,第1张

1、 使用数据库自增Id

优势:编码简单,无需考虑记录唯一标识的问题。

缺陷:

1) 在大表做水平分表时,就不能使用自增Id,因为Insert的记录插入到哪个分表依分表规则判定决定,若是自增Id,各个分表中Id就会重复,在做查询、删除时就会有异常。

2) 在对表进行高并发单记录插入时需要加入事物机制,否则会出现Id重复的问题。

3) 在业务上 *** 作父、子表(即关联表)插入时,需要在插入数据库之前获取max(id)用于标识父表和子表关系,若存在并发获取max(id)的情况,max(id)会同时被别的线程获取到。

4) 等等。

结论:适合小应用,无需分表,没有高并发性能要求。

2、 单独开一个数据库,获取全局唯一的自增序列或各表的MaxId

1) 使用自增序列号表

专门一个数据库,生成序列号。开启事物,每次 *** 作插入时,先将数据插入到序列表并返回自增序列号用于做为唯一Id进行业务数据插入。

注意:需要定期清理序列表的数据以保证获取序列号的效率;插入序列表记录时要开启事物。

使用此方案的问题是:每次的查询序列号是一个性能损耗;如果这个序列号列暴了,那就杯具了,你不知道哪个表使用了哪个序列,所以就必须换另一种唯一Id方式如GUID。

2) 使用MaxId表存储各表的MaxId值

专门一个数据库,记录各个表的MaxId值,建一个存储过程来取Id,逻辑大致为:开启事物,对于在表中不存在记录,直接返回一个默认值为1的键值,同时插入该条记录到table_key表中。而对于已存在的记录,key值直接在原来的key基础上加1更新到MaxId表中并返回key。

使用此方案的问题是:每次的查询MaxId是一个性能损耗;不过不会像自增序列表那么容易列暴掉,因为是摆表进行划分的。

@echo off

rem 假设这些文件在c盘的test目录下:

for /f %%i in ('dir c:\test /b/a-d') do call :ren_ %%i

goto :eof

:ren_

set filename=%1

set /a fileno=%filename:~1,-4%

set filetype=%filename:~-4%

set /a newfileno=%fileno%+115

set newfilename=0%newfileno%%filetype%

ren c:\test\%filename% %newfilename%

STM32的唯一ID存在一个固定的地址,你直接读取地址里面的数据就是唯一ID了。

唯一ID是一个96位的数据,所以你要创建3个32位变量用于存储ID号

static u32 CpuID[3];

接着执行读取函数就可以了。

void GetLockCode(void)

{

//获取CPU唯一ID

CpuID[0]=(vu32)(0x1ffff7e8);

CpuID[1]=(vu32)(0x1ffff7ec);

CpuID[2]=(vu32)(0x1ffff7f0);

}

 方法步骤(以安卓50为例)

一、依次点击 设定---关于设备---状态。

二、现在可以看到安卓设备的IMEI(国际移动设备识别码)唯一编号。

三、或者用手机的拨号键盘输入#06# 可以d出IMEI

以上就是关于如何在高并发分布式系统中生成全局唯一Id全部的内容,包括:如何在高并发分布式系统中生成全局唯一Id、批处理--dos高手--怎么获取计算机唯一ID(机器码)、如何读取STM32芯片的唯一ID等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9348443.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存