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
雪花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.IdGenerator
和Aegis.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);