首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  算法

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

  •  
  •   jaylee4869 · 79 天前 · 1607 次点击
    这是一个创建于 79 天前的主题,其中的信息可能已经有所发展或是发生改变。

    snowflake 太长了。。。

    8 回复  |  直到 2019-10-18 00:17:34 +08:00
        1
    mayx   79 天前 via Android
    节点号+随机数
        2
    iPhoneXI   79 天前 via Android
    号段模式
        3
    Raymon111111   79 天前
    机器自己注册一个 id (用数据库主键是最简单的), 启动的时候放在本地.

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

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

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

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

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

    3. 并不是严格自增的
        5
    oneisall8955   79 天前 via Android
    美团团队在雪花算法里面做了优化,没用过,希望有帮助
        6
    WordTian   79 天前 via Android
    时间 一,节点码,自增序号
        7
    jaylee4869   65 天前
    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;
    }
    }
        8
    lxk11153   59 天前
    Leaf——美团点评分布式 ID 生成系统
    ht 河蟹 tps://tech.meituan.c 河蟹 om/2017/04/21/mt-leaf.html)
    美团点评分布式 ID 生成系统中 Leaf-segment 数据库方案的实现
    ht 河蟹 tps://github.c 河蟹 om/zhuzhong/idleaf
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4452 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 02:18 · PVG 10:18 · LAX 18:18 · JFK 21:18
    ♥ Do have faith in what you're doing.