分布式环境生成 10 位不重复数怎么玩?

2019-09-27 19:15:02 +08:00
 jaylee4869

snowflake 太长了。。。

4306 次点击
所在节点    算法
8 条回复
mayx
2019-09-27 19:17:07 +08:00
节点号+随机数
iPhoneXI
2019-09-27 19:22:03 +08:00
号段模式
Raymon111111
2019-09-27 19:27:43 +08:00
机器自己注册一个 id (用数据库主键是最简单的), 启动的时候放在本地.

然后 时间(unixtime 秒级别) + id + 几位随机数(比如三位 000 - 999) 就可以弄出十几位的不重复数

机器生成的时候把单秒生成的数存在本地(注意做好多线程控制), 保证自己一秒内不生成重复的(重复后重来一个即可)

风险点有这么几个, 结合自身的业务, 一般下面的限制点都不会成为问题

1. 机器的 id 位数是固定的, 比如也是限制 3 位, 那么这就不支持超过 1000 台机器同时干这么事, 总之一开始设置的机器 id 位数不能改变

2. 一秒内单台机器生成的 id 不能特别多 (虽然上限是 1000, 但是太多之后冲突多了也影响效率)

3. 并不是严格自增的
alpha2016
2019-09-27 19:31:39 +08:00
oneisall8955
2019-09-27 19:53:30 +08:00
美团团队在雪花算法里面做了优化,没用过,希望有帮助
WordTian
2019-09-27 20:03:22 +08:00
时间 一,节点码,自增序号
jaylee4869
2019-10-11 15:53:08 +08:00
public class RandomIDUtils {

private static final long LIMIT = 1000000000L;
private static long last = 0;
// 集群环境下修改此 workerId(1,2,3 依次递增)
private static final long workerId = 1;

/**
* 生成 10 位不重复数字, 首位为 workerId
* 线程安全
* 单调递增
*/
public static long getID() {
long id = System.currentTimeMillis() % LIMIT;
if (id <= last) {
id = (last + 1) % LIMIT;
}
return (last = id) + workerId * LIMIT;
}
}
lxk11153
2019-10-18 00:17:34 +08:00
Leaf——美团点评分布式 ID 生成系统
ht 河蟹 tps://tech.meituan.c 河蟹 om/2017/04/21/mt-leaf.html)
美团点评分布式 ID 生成系统中 Leaf-segment 数据库方案的实现
ht 河蟹 tps://github.c 河蟹 om/zhuzhong/idleaf

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604922

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX