当前位置:首页 » 云服务器 » 多台服务器如何生成全局唯一id

多台服务器如何生成全局唯一id

发布时间: 2022-06-26 16:37:15

‘壹’ 如何在高并发分布式系统中生成全局唯一id

我了解的方案如下…………………………………………………………………… 1、 使用数据库自增Id 优势:编码简单,无需考虑记录唯一标识的问题。 缺陷: 1) 在大表做水平分表时,就不能使用自增Id,因为Insert的记录插入到哪个分表依分表规则判定决定,若是自增Id,各个分表中Id就会重复,在做查询、删除时就会有异常。 2) 在对表进行高并发单记录插入时需要加入事物机制,否则会出现Id重复的问题。 3) 在业务上操作父、子表(即关联表)插入时,需要在插入数据库之前获取max(id)用于标识父表和子表关系,若存在并发获取max(id)的情况,max(id)会同时被别的线程获取到。 4) 等等。 结论:适合小应用,无需分表,没有高并发性能要求。 2、 单独开一个数据库,获取全局唯一的自增序列号或各表的MaxId

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

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是一个性能损耗;不过不会像自增序列表那么容易列暴掉,因为是摆表进行划分的。
详细可参考:《使用MaxId表存储各表的MaxId值,以获取全局唯一Id》
我截取此文中的sql语法如下:

第一步:创建表
create table table_key
(
table_name varchar(50)not null primary key,
key_value int not null
)

第二步:创建存储过程来取自增ID
create procere up_get_table_key
(
@table_name varchar(50),
@key_value int output
)
as
begin
begin tran
declare @key int

--initialize the key with 1
set @key=1
--whether the specified table is exist
if not exists(selecttable_name from table_key wheretable_name=@table_name)
begin
insert into table_keyvalues(@table_name,@key) --default key vlaue:1
end
-- step increase
else
begin
select @key=key_valuefrom table_key with (nolock) where table_name=@table_name
set @key=@key+1
--update the key value by table name
update table_key setkey_value=@key where table_name=@table_name
end
--set ouput value
set @key_value=@key

--commit tran
commit tran
if @@error>0
rollback tran
end

转载仅供参考,版权属于原作者。

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

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是一个性能损耗;不过不会像自增序列表那么容易列暴掉,因为是摆表进行划分的。

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

c# 中的 Guid 就是唯一的,它保证对在同一时空中的所有机器都是唯一的. 据我所知,它也会产生碰撞,但是概率极小,完全可以不用理会的小。 可以用现有的支持原子操作的分布式数据库, 例:Redis 很多网站用Redis 的原子性来生成唯一标识符 我们可以用本机的Mac地址,硬盘序列号,本地最大标识符来拼接出唯一。 Mac 可被修改,硬盘序列号也有可能不唯一,但是这三样拼接在一起,碰撞的概率很小的 Md5 也会碰撞,不是么?

‘伍’ 分布式系统中,怎么样生成全局唯一的 ID

一种是分区段,例如,联通手机什么开头,网通... 一种是设一个全局唯一服务器负责这件事 谁有好主意,实际中用过,继续添加

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

我了解的方案如下……………………………………………………………………1、使用数据库自增Id优势:编码简单,无需考虑记录唯一标识的问题。缺陷:1)在大表做水平分表时,就不能使用自增Id,因为Insert的记录插入到哪个分表依分表规则判定决定,若是自增Id,各个分表中Id就会重复,在做查询、删除时就会有异常。2)在对表进行高并发单记录插入时需要加入事物机制,否则会出现Id重复的问题。3)在业务上操作父、子表(即关联表)插入时,需要在插入数据库之前获取max(id)用于标识父表和子表关系,若存在并发获取max(id)的情况,max(id)会同时被别的线程获取到。4)等等。结论:适合小应用,无需分表,没有高并发性能要求。2、单独开一个数据库,获取全局唯一的自增序列号或各表的MaxId

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

一种是分区段,例如,联通手机什么开头,网通...
一种是设一个全局唯一服务器负责这件事

谁有好主意,实际中用过,继续添加

热点内容
维普中文期刊数据库 发布:2025-02-05 00:45:33 浏览:754
安卓哪里填写apple代码 发布:2025-02-05 00:28:54 浏览:290
oppo手机锁屏密码忘记后如何更换 发布:2025-02-05 00:28:19 浏览:27
幼儿思维编程 发布:2025-02-05 00:18:21 浏览:25
我的世界电脑正版如何进入服务器 发布:2025-02-05 00:18:06 浏览:880
疫情防控健康码预警机制演练脚本 发布:2025-02-04 23:58:46 浏览:39
分治算法java 发布:2025-02-04 23:41:15 浏览:593
安卓app点进去就闪退怎么回事 发布:2025-02-04 23:36:56 浏览:780
宏按键编程 发布:2025-02-04 23:05:11 浏览:904
微信隐形密码在哪里设置 发布:2025-02-04 23:05:01 浏览:866