Browse Source

code_editreadme

tags/v1.0.0
zhouzj 3 years ago
parent
commit
761020f3eb
12 changed files with 54 additions and 29 deletions
  1. +5
    -5
      README.md
  2. +0
    -0
      src/Yitter.IdGen.sln
  3. +5
    -5
      src/Yitter.IdGenTest/Program.cs
  4. +7
    -0
      src/Yitter.IdGenerator/Contract/IIdGenerator.cs
  5. +0
    -0
      src/Yitter.IdGenerator/Contract/ISnowWorker.cs
  6. +0
    -0
      src/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs
  7. +22
    -0
      src/Yitter.IdGenerator/Contract/OverCostActionArg.cs
  8. +0
    -0
      src/Yitter.IdGenerator/Core/SnowWorkerM1.cs
  9. +0
    -0
      src/Yitter.IdGenerator/Core/SnowWorkerM2.cs
  10. +9
    -6
      src/Yitter.IdGenerator/DefaultIdGenerator.cs
  11. +6
    -10
      src/Yitter.IdGenerator/IdHelper.cs
  12. +0
    -3
      src/Yitter.IdGenerator/Yitter.IdGenerator.csproj

+ 5
- 5
README.md View File

@@ -58,7 +58,7 @@

1.js Number 类型最大数值:9007199254740992,本算法在保持并发性能(5W+/0.01s)和最大64个 WorkerId(6bit)的同时,能用70年才到 js Number Max 值。

2.增加WorkerId位数到8bit(128节点)时,15年达到 js Number Max 值。
2.增加WorkerId位数到8bit(256节点)时,15年达到 js Number Max 值。

3.极致性能:500W/1s。

@@ -167,14 +167,14 @@
```
// 全局初始化设置WorkerId,默认最大2^16-1。(初始化过程全局只需一次,且必须最先设置)
var options = new IdGeneratorOptions(){ WorkerId = 1};
YidHelper.SetIdGenerator(options);
IdHelper.SetIdGenerator(options);

// 初始化以后,就可以在需要的地方调用方法生成ID。
var newId = YidHelper.NextId();
var newId = IdHelper.NextId();

// 可通过 YidHelper.IdGenInstance 订阅 GenIdActionAsync 事件。
// 可通过 IdHelper.IdGenInstance 订阅 GenIdActionAsync 事件。
```
如果基于DI框架集成,可以参考 YidHelper 去管理 IdGenerator 对象,必须使用**单例**模式。
如果基于DI框架集成,可以参考 IdHelper 去管理 IdGenerator 对象,必须使用**单例**模式。

#### options说明
```


src/Yitter.IdGenerator.sln → src/Yitter.IdGen.sln View File


+ 5
- 5
src/Yitter.IdGenTest/Program.cs View File

@@ -44,13 +44,13 @@ namespace Yitter.OrgSystem.TestA
WorkerId = 1,
TopOverCostCount = 2000,
//WorkerIdBitLength = 6,
//SeqBitLength = 6,
WorkerIdBitLength = 10,
SeqBitLength = 6,
//MinSeqNumber = 11,
//MaxSeqNumber = 200,
//StartTime = DateTime.Now.AddYears(-1),
StartTime = DateTime.Now.AddYears(-5),
};
// ++++++++++++++++++++++++++++++++
@@ -59,7 +59,7 @@ namespace Yitter.OrgSystem.TestA
IdGeneratorOptions options1 = (newConfig);
if (IdGen == null)
{
IdGen = new YidGenerator(options1);
IdGen = new DefaultIdGenerator(options1);
}
if (outputLog)
@@ -105,7 +105,7 @@ namespace Yitter.OrgSystem.TestA
};
Console.WriteLine("Gen:" + i);
var idGen2 = new YidGenerator(options);
var idGen2 = new DefaultIdGenerator(options);
var test = new GenTest(idGen2, genIdCount, i);
if (outputLog)


src/Yitter.IdGenerator/IIdGenerator.cs → src/Yitter.IdGenerator/Contract/IIdGenerator.cs View File

@@ -13,8 +13,15 @@ namespace Yitter.IdGenerator
{
public interface IIdGenerator
{
/// <summary>
/// 生成过程中产生的事件
/// </summary>
Action<OverCostActionArg> GenIdActionAsync { get; set; }

/// <summary>
/// 生成新的long型Id
/// </summary>
/// <returns></returns>
long NewLong();

// Guid NewGuid();

src/Yitter.IdGenerator/ISnowWorker.cs → src/Yitter.IdGenerator/Contract/ISnowWorker.cs View File


src/Yitter.IdGenerator/IdGeneratorOptions.cs → src/Yitter.IdGenerator/Contract/IdGeneratorOptions.cs View File


src/Yitter.IdGenerator/OverCostActionArg.cs → src/Yitter.IdGenerator/Contract/OverCostActionArg.cs View File

@@ -13,13 +13,35 @@ using System.Text;
namespace Yitter.IdGenerator
{
/// <summary>
/// Id生成时回调参数
/// </summary>
public class OverCostActionArg
{
/// <summary>
/// 事件类型
/// 1-开始,2-结束,8-漂移
/// </summary>
public int ActionType { get; set; }
/// <summary>
/// 时间戳
/// </summary>
public long TimeTick { get; set; }
/// <summary>
/// 机器码
/// </summary>
public ushort WorkerId { get; set; }
/// <summary>
/// 漂移计算次数
/// </summary>
public int OverCostCountInOneTerm { get; set; }
/// <summary>
/// 漂移期间生产ID个数
/// </summary>
public int GenCountInOneTerm { get; set; }
/// <summary>
/// 漂移周期
/// </summary>
public int TermIndex { get; set; }
public OverCostActionArg(ushort workerId, long timeTick, int actionType = 0, int overCostCountInOneTerm = 0, int genCountWhenOverCost = 0,int index=0)

src/Yitter.IdGenerator/SnowWorkerM1.cs → src/Yitter.IdGenerator/Core/SnowWorkerM1.cs View File


src/Yitter.IdGenerator/SnowWorkerM2.cs → src/Yitter.IdGenerator/Core/SnowWorkerM2.cs View File


src/Yitter.IdGenerator/YidGenerator.cs → src/Yitter.IdGenerator/DefaultIdGenerator.cs View File

@@ -14,7 +14,10 @@ using System.Threading;
namespace Yitter.IdGenerator
{
public class YidGenerator : IIdGenerator
/// <summary>
/// 默认实现
/// </summary>
public class DefaultIdGenerator : IIdGenerator
{
private ISnowWorker _SnowWorker { get; set; }
@@ -25,7 +28,7 @@ namespace Yitter.IdGenerator
}
public YidGenerator(IdGeneratorOptions options)
public DefaultIdGenerator(IdGeneratorOptions options)
{
if (options == null)
{
@@ -45,24 +48,24 @@ namespace Yitter.IdGenerator
var maxWorkerIdNumber = Math.Pow(2, options.WorkerIdBitLength) - 1;
if (options.WorkerId < 1 || options.WorkerId > maxWorkerIdNumber)
{
throw new ApplicationException("WorkerId is error. (range:[1, " + maxWorkerIdNumber + "]");
throw new ApplicationException("WorkerId error. (range:[1, " + maxWorkerIdNumber + "]");
}
if (options.SeqBitLength < 2 || options.SeqBitLength > 21)
{
throw new ApplicationException("SeqBitLength is error. (range:[2, 21])");
throw new ApplicationException("SeqBitLength error. (range:[2, 21])");
}
var maxSeqNumber = Math.Pow(2, options.SeqBitLength) - 1;
if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber)
{
throw new ApplicationException("MaxSeqNumber is error. (range:[1, " + maxSeqNumber + "]");
throw new ApplicationException("MaxSeqNumber error. (range:[1, " + maxSeqNumber + "]");
}
var maxValue = maxSeqNumber - 2;
if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxValue)
{
throw new ApplicationException("MinSeqNumber is error. (range:[5, " + maxValue + "]");
throw new ApplicationException("MinSeqNumber error. (range:[5, " + maxValue + "]");
}
switch (options.Method)

src/Yitter.IdGenerator/YidHelper.cs → src/Yitter.IdGenerator/IdHelper.cs View File

@@ -16,17 +16,11 @@ namespace Yitter.IdGenerator
/// <summary>
/// 这是一个调用的例子,默认情况下,单机集成者可以直接使用 NewId()。
/// </summary>
public class YidHelper
public class IdHelper
{
private static IIdGenerator _IdGenInstance = null;
public static IIdGenerator IdGenInstance
{
get
{
return _IdGenInstance;
}
}
public static IIdGenerator IdGenInstance => _IdGenInstance;
/// <summary>
/// 设置参数,建议程序初始化时执行一次
@@ -34,7 +28,7 @@ namespace Yitter.IdGenerator
/// <param name="options"></param>
public static void SetIdGenerator(IdGeneratorOptions options)
{
_IdGenInstance = new YidGenerator(options);
_IdGenInstance = new DefaultIdGenerator(options);
}
/// <summary>
@@ -47,7 +41,9 @@ namespace Yitter.IdGenerator
{
if (_IdGenInstance == null)
{
_IdGenInstance = new YidGenerator(new IdGeneratorOptions() { WorkerId = 1 });
_IdGenInstance = new DefaultIdGenerator(
new IdGeneratorOptions() { WorkerId = 1 }
);
}
return _IdGenInstance.NewLong();

+ 0
- 3
src/Yitter.IdGenerator/Yitter.IdGenerator.csproj View File

@@ -12,7 +12,4 @@
<WarningLevel>5</WarningLevel>
</PropertyGroup>
<ItemGroup>
</ItemGroup>
</Project>

Loading…
Cancel
Save