温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行关于全局ID、snowflake算法的分析

发布时间:2021-12-23 17:59:18 来源:亿速云 阅读:180 作者:柒染 栏目:大数据

这篇文章将为大家详细讲解有关如何进行关于全局ID、snowflake算法的分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一开始我用的是这个简化版本,后来发现有重复项。。。(demo:https://github.com/dunitian/TempCode/tree/master/2016-11-16/Twitter_Snowflake)

如何进行关于全局ID、snowflake算法的分析

之后在外国大牛的基础上重写修改了部分内容(https://github.com/ccollie/snowflake-net),添加了一些注解等【支持Core】。现在是可以去Nuget直接下载使用的:Snowflake.Net

测试用例:

如何进行关于全局ID、snowflake算法的分析

测试代码: 


using      System;    
using      System.Collections.Generic;    
using      System.Threading;    
using      System.Threading.Tasks;    
using      Snowflake.Net;    
 
namespace      Snowflake.ZConsole    
{    
          class      Program    
          {    
              private      static      int      N = 2000000;    
              private      static      HashSet<      long      >      set      =      new      HashSet<      long      >();    
              private      static      IdWorker worker =      new      IdWorker(1, 1);    
              private      static      int      taskCount = 0;    
 
              static      void      Main(      string      [] args)    
              {    
                  Task.Run(() => GetID());    
                  Task.Run(() => GetID());    
                  Task.Run(() => GetID());    
 
                  Task.Run(() => Printf());    
                  Console.ReadKey();    
              }    
 
              private      static      void      Printf()    
              {    
                  while      (taskCount != 3)    
                  {    
                      Console.WriteLine(      "..."      );    
                      Thread.Sleep(1000);    
                  }    
                  Console.WriteLine(      set      .Count == N * taskCount);    
              }    
 
              private      static      object      o =      new      object      ();    
              private      static      void      GetID()    
              {    
                  for      (      var      i = 0; i < N; i++)    
                  {    
                      var      id = worker.NextId();    
 
                      lock      (o)    
                      {    
                          if      (      set      .Contains(id))    
                          {    
                              Console.WriteLine(      "发现重复项 : {0}"      , id);    
                          }    
                          else    
                          {    
                              set      .Add(id);    
                          }    
                      }    
 
                  }    
                  Console.WriteLine($      "任务{++taskCount}完成"      );    
              }    
          }    
}    

可能有些人只关心以后怎么用?==》

IdWorker worker = new IdWorker(1, 1); //大并发的情况下,减少new的次数可以有效避免重复的可能

var id = worker.NextId();

有可能上面的减少new有些同志不太懂,(⊙o⊙)…,举个例子:

测试代码不变的情况下,改这么一句:

如何进行关于全局ID、snowflake算法的分析

如何进行关于全局ID、snowflake算法的分析

完整调用demo:(https://github.com/dunitian/snowflake-net/tree/master/Demo)

如何进行关于全局ID、snowflake算法的分析

 core:(https://github.com/dunitian/snowflake-net/tree/master/Demo.Core)

如何进行关于全局ID、snowflake算法的分析

关于如何进行关于全局ID、snowflake算法的分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI