
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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)