家政服务技术支持东莞网站建设,门户站模板,网站的布局和配色,黄山旅游攻略住宿雪花Id生成算法#xff0c;是鼎鼎有名的分布式Id生成算法。它的优点在于#xff0c;在分布式系统中快速生成有时间顺序的唯一编号#xff01;Snowflake实测每秒可生成900万个唯一Id。Nuget包#xff1a;NewLife.Core源码地址#xff1a;https://github.com/NewLifeX/X/blo… 雪花Id生成算法是鼎鼎有名的分布式Id生成算法。它的优点在于在分布式系统中快速生成有时间顺序的唯一编号Snowflake实测每秒可生成900万个唯一Id。Nuget包NewLife.Core源码地址https://github.com/NewLifeX/X/blob/master/NewLife.Core/Data/Snowflake.cs核心原理使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛且ID 引入了时间戳基本上保持自增。格式1bit保留 41bit时间戳 10bit机器 12bit序列号第一位不使用主要是为了避免部分场景变成负数41位时间戳也就是2的41次方毫秒为单位足够保存69年。这里一般存储1970年以来的毫秒数建议各个系统根据需要自定义这个开始日期10位机器码理论上可以表示1024台机器也可以拆分几位表示机房几位表示机器。这里默认采用本机IPv4地址最后两段以及进程Id一起作为机器码确保机房内部不同机器以及相同机器上的不同进程拥有不同的机器码12位序列号表示范围0~4095一直递增即使毫秒数加一这里也不会归零避免被恶意用户轻易猜测得到前后订单号生成IdNewId用于生成新的唯一Id/// summary获取下一个Id/summary
/// returns/returns
public virtual Int64 NewId();/// summary获取指定时间的Id带上节点和序列号。可用于根据业务时间构造插入Id/summary
/// param nametime时间/param
/// returns/returns
public virtual Int64 NewId(DateTime time);
无参版默认使用当前时间生成唯一Id也可以给指定时间生成唯一Id。以下是采用雪花Id作为订单号。解析Id大型数据表例如订单表、日志表等可以使用Int64作为主键然后使用雪花Id。因为雪花Id内带有时间戳信息因此我们可以根据主键Id来直接搜索指定时间区间的数据。/// summary时间转为Id不带节点和序列号。可用于构建时间片段查询/summary
/// param nametime时间/param
/// returns/returns
public virtual Int64 GetId(DateTime time);
GetId用于计算指定时间的基准Id只有最高的时间部分机器码和序列化为零。我们在计算指定时间区间start, end内的数据时可以有Select * from Order where IdGet(start) and IdGetId(end);
拿到一个雪花Id也可以从中解析得到时间等信息/// summary尝试分析/summary
/// param nameid/param
/// param nametime时间/param
/// param nameworkerId节点/param
/// param namesequence序列号/param
/// returns/returns
public virtual Boolean TryParse(Int64 id, out DateTime time, out Int32 workerId, out Int32 sequence);
解析订单号 152075078181383514 时间基准设为 2020年1月1日总结在分布式系统中雪花Id具有非常重要的意义。星尘大量使用雪花Id用于存储跟踪数据和采样数据以前必须先插入跟踪数据得到自增Id然后才能插入采样数据需要关联的问题迎难而解两者都可以同时走批量插入。对于日志型数据表强烈推荐使用雪花Id因为它带有时间戳信息等同于省去了CreateTime字段的索引。