ID 生成器

目前ID生成器提供雪花ID和模板ID两种ID生成

如何引入

ID生成器功能包含在Aegis.IdGenerator的Nuget包中。如果只引入该包,只提供了内存版本的雪花ID。

同时还提供了基于Redis容器的模板ID扩展Nuget包Aegis.IdGenerator.Provider.Redis,需要注意的是该包依赖于Aegis.Caching.Redis

在引入Nuget包后,请确认Component.deps.json配置文件中的Services节点中含有IdGenerator

image.png

雪花ID生成

使用雪花ID需要有以下配置 目前默认提供的雪花ID是基于内存计算的,为保证唯一性,请确保每个服务设置的WorkerId均不一样

"IdGenerator": {  
  "WorkerId": 2,   //具体的WorkerId
  "WorkerIdLength": 5,   //WorkerId的位数
  "IndexLength": 8   //流水号位数
}

雪花ID使用

在构造方法里获取IIdGenerator即可使用

public class SnowflakeService : ISnowflakeService
{  
    private readonly IIdGenerator _idGenerator;  
    public SnowflakeService(IIdGenerator idGenerator)  
    {
        _idGenerator = idGenerator;  
    }
    ...
}

通过 IIdGenerator.NextId()即可获取唯一ID

long id = _idGenerator.NextId()

模板ID生成

目前模板ID只基于Redis容器实现,需要额外导入Aegis.IdGenerator.Provider.Redis的Nuget包,该包同时依赖于Aegis.IdGeneratorAegis.Caching.Redis

ID模板提供者

自定义实现模板提供者,继承于IIdTemplateProvider,实现GetIdTemplates的具体方法,以下是个写死的案例,可以从数据库拿也可以从Redis中拿,自定义实现即可。

public class TemplateProvider : IIdTemplateProvider  
{  
    public IdTemplate[] GetIdTemplates()  
    {        
        IdTemplate template = new IdTemplate()  
        {  
            Key = "A1",  
            PaddingChar = '0',  
            DateReset = true,  
            CanReturn = true,  
            FormatString = "Test{Date}{SerialNum}",  
            SerialNumLength = 6  
        };  

        return new[] { template };  
    }
}

IdTemplate实体记录如下:


public record IdTemplate
{
    /// <summary>
    /// 模板 Key
    /// </summary>
    public string Key { get; set; }

    /// <summary>
    /// 是否可归还
    /// </summary>
    public bool CanReturn { get; set; }

    /// <summary>
    /// 日期重置流水号
    /// </summary>
    public bool DateReset { get; set; }

    /// <summary>
    /// 模板Format
    /// </summary>
    public string FormatString { get; set; }

    /// <summary>
    /// 流水号长度
    /// </summary>
    public int SerialNumLength { get; set; }

    /// <summary>
    /// 填充字符串,默认为0
    /// </summary>
    public char PaddingChar { get; set; }

    /// <summary>
    /// 最小流水号
    /// </summary>
    public int? MinSerialNum { get; set; }

    /// <summary>
    /// 最大流水号
    /// </summary>
    public int? MaxSerialNum { get; set; }

    /// <summary>
    /// 归还时间
    /// </summary>
    public TimeSpan RecoveryTime { get; set; }
}

注入ID模板

模板ID需要在Startup中指定RedisSource,同时注入实现的模板提供器,注入后模板就导入到ID模板容器里了。

public sealed class Startup : ICustomStartup  
{
    ...
    public void ConfigureServices(IServiceCollection services)  
    {
        ...
        services.AddRedisSource<AegisRedisSource>(ConfigManager.Get<RedisOptions>("Redis"));   //注入自定义RedisSource
        services.AddIdRedisContainer<AegisRedisSource>(); //指定ID-Redis容器,泛型T传入自定义RedisSource,用于绑定
        services.AddIdTemplateProvider<TemplateProvider>(); //添加模板提供器
        ...
    }
    ...
}

如何使用

在构造方法中获取ITemplateIdGenerator即可获取模板ID生成器

public class TemplateIdService : ITemplateIdService 
{  
    private ITemplateIdGenerator _idGenerator;   //模板ID生成器
    private IIdTemplateManager _idTemplateManager;   //模板ID管理者,如果只是使用生成器不需要获取这个
    ...
    public IdTestController(ITemplateIdGenerator templateIdGenerator,IIdTemplateManager idTemplateManager)  
    {   
        _idGenerator = templateIdGenerator;  
        _idTemplateManager = idTemplateManager;  
    }
    ...
}

获取ID

使用只需要传入模板key就可以获取对应模板下的Id了 获取一个模板ID

string id = _idGenerator.GetId(key);

获取一批模板ID

string[] ids = _idGenerator.GetIds(key,30); //根据模板Key获取一批ID(30)

新增/移除模板

新增一个模板到容器内,(注意key不能重复,重复key是无法添加成功的)

    _idTemplateManager.Add(new IdTemplate()  
    {  
        Key = key,  
        CanReturn = true,  
        FormatString = format,  
        DateReset = false,  
        PaddingChar = '0',  
        SerialNumLength = 8  
    });

移除对应Key的模板

_idTemplateManager.Remove(key);

results matching ""

    No results matching ""