跳到主要内容
版本:3.0.0

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.IdGeneratorAegis.Caching.Redis
核心能力ISerialNumberProvider 的 Redis 实现
注册入口AddIdRedisContainer<T>()

它和主组件怎么配合

组件负责什么
Aegis.IdGenerator模板规则、模板管理、模板生成
Aegis.IdGenerator.Provider.Redis模板流水号的 Redis 存储与分配
Aegis.Caching.RedisRedis 数据源底座

所以它一定不是独立接入,而是建立在前两者都已经准备好的基础上。

最小可运行路径

第一步:启用模板能力

{
"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 };
}
}

CanReturnDateReset 最值得注意

CanReturn

表示编号是否允许归还。
如果不允许归还,就不要再调用 ReleaseId(...)

DateReset

表示流水号是否按日期重置。
适合场景:

  • 单号里含日期
  • 每天都希望从新的流水段开始

接入完成后怎么确认成功

你至少应该确认这些点:

  • Redis 数据源已经接好
  • AddIdRedisContainer<T>() 已执行
  • 至少注册了一个 IIdTemplateProvider
  • 容器里可以注入 ITemplateIdGenerator
  • 多个实例生成同一模板编号时,不会拿到重复流水号

常见问题

为什么已经有模板能力,但还是拿不到连续编号

通常是只启用了 Aegis.IdGenerator,却没有继续注册 Redis 序号容器。

为什么 GetId("A1") 会报模板不存在

优先检查模板提供者是否真的已经注册,以及返回的模板 Key 是否就是 A1

为什么 ReleaseId(...) 后编号没有按预期复用

优先确认:

  1. 模板是否设置了 CanReturn = true
  2. 当前业务是否又调用了 ConfirmId(...)
  3. Redis 是否真的可用

下一步看哪里