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

这篇文章将为大家详细讲解有关如何进行关于全局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算法的分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

原创文章,作者:carmelaweatherly,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/238710.html

(0)
上一篇 2022年2月6日 23:00
下一篇 2022年2月6日 23:00

相关推荐

发表回复

登录后才能评论