Redis ID 生成提供程序(Aegis.IdGenerator.Provider.Redis)
Aegis.IdGenerator.Provider.Redis 是模板 ID 的 Redis 序号提供程序。它不会单独产生编号能力,而是把模板编号里的流水号分配、归还和确认动作落到 Redis 中,适合多实例共享同一套业务编号的场景。
组件概览
| 字段 | 说明 |
|---|---|
| 组件名称 | Redis ID 生成提供程序 |
| 真实类库 | Aegis.IdGenerator.Provider.Redis |
| 组件定位 | 给模板 ID 提供 Redis 序号容器 |
| 引入方式 | 安装 NuGet,并在代码中调用 AddIdRedisContainer<T>() |
是否需要 Component.deps.json | 否 |
| 依赖 | Aegis.IdGenerator、Aegis.Caching.Redis |
| 核心能力 | ISerialNumberProvider 的 Redis 实现 |
| 注册入口 | AddIdRedisContainer<T>() |
它和主组件怎么配合
| 组件 | 负责什么 |
|---|---|
Aegis.IdGenerator | 模板规则、模板管理、模板生成 |
Aegis.IdGenerator.Provider.Redis | 模板流水号的 Redis 存储与分配 |
Aegis.Caching.Redis | Redis 数据源底座 |
所以它一定不是独立接入,而是建立在前两者都已经准备好的基础上。
最小可运行路径
第一步:启用模板能力
{
"Components": {
"Services": [
"IdGenerator.TemplateId"
]
}
}
如果你们本来就启用了总入口 IdGenerator,这一步就已经包含了模板能力。
第二步:接好 RedisSource
services.AddRedisSource<AegisRedisSource>(
ConfigManager.Get<RedisOptions>("Redis"));
第三步:注册 Redis 序号容器
services.AddIdRedisContainer<AegisRedisSource>();
第四步:注册模板提供者
services.AddIdTemplateProvider<TemplateProvider>();
一个完整的接入示例
services.AddRedisSource<AegisRedisSource>(
ConfigManager.Get<RedisOptions>("Redis"));
services.AddIdRedisContainer<AegisRedisSource>();
services.AddIdTemplateProvider<TemplateProvider>();
services.AddIdTemplateProvider<Template2Provider>();
什么时候必须接它
适合场景:
- 模板编号需要多实例共享同一套流水号
- 模板编号需要归还和再次分配
- 模板编号要跨实例保持连续和一致
如果只是单机、本地或临时验证模板格式,本地序号也许能先跑;但只要进入多节点场景,更稳的做法就是接当前组件。
模板 ID 在 Redis 里会处理哪些动作
当前提供程序主要负责:
- 分配单个流水号
- 批量分配流水号
- 归还可回收流水号
- 确认流水号已被正式使用
对应到使用侧,最常见的就是这几组操作:
var id = _templateIdGenerator.GetId("A1");
var ids = _templateIdGenerator.GetIds("A1", 30);
_templateIdGenerator.ReleaseId("A1", id);
_templateIdGenerator.ConfirmId("A1", id);
_templateIdGenerator.ConfirmIds("A1", ids);
模板提供者最常见怎么写
public class TemplateProvider : IIdTemplateProvider
{
public async Task<IdTemplate[]> GetIdTemplates()
{
var template = new IdTemplate
{
Key = "A1",
PaddingChar = '0',
DateReset = true,
CanReturn = true,
FormatString = "Test{Date}{SerialNum}",
SerialNumLength = 6
};
return new[] { template };
}
}
CanReturn 和 DateReset 最值得注意
CanReturn
表示编号是否允许归还。
如果不允许归还,就不要再调用 ReleaseId(...)。
DateReset
表示流水号是否按日期重置。
适合场景:
- 单号里含日期
- 每天都希望从新的流水段开始
接入完成后怎么确认成功
你至少应该确认这些点:
- Redis 数据源已经接好
AddIdRedisContainer<T>()已执行- 至少注册了一个
IIdTemplateProvider - 容器里可以注入
ITemplateIdGenerator - 多个实例生成同一模板编号时,不会拿到重复流水号
常见问题
为什么已经有模板能力,但还是拿不到连续编号
通常是只启用了 Aegis.IdGenerator,却没有继续注册 Redis 序号容器。
为什么 GetId("A1") 会报模板不存在
优先检查模板提供者是否真的已经注册,以及返回的模板 Key 是否就是 A1。
为什么 ReleaseId(...) 后编号没有按预期复用
优先确认:
- 模板是否设置了
CanReturn = true - 当前业务是否又调用了
ConfirmId(...) - Redis 是否真的可用