资讯动态

一个应用连多个Redis:StackExchange.Redis.Extensions多实例与Keyed Services实战教程

发布时间:2026/8/25 9:34:11 来源:尧图企业网站定制
一个应用连多个RedisStackExchange.Redis.Extensions多实例与Keyed Services实战教程【免费下载链接】StackExchange.Redis.ExtensionsStackExchange.Redis.Extensions is a library that extends StackExchange.Redis, making it easier to work with Redis in .NET applications项目地址: https://gitcode.com/gh_mirrors/st/StackExchange.Redis.ExtensionsStackExchange.Redis.Extensions是一个扩展 StackExchange.Redis 的 .NET 库让 .NET 应用更轻松地使用 Redis。它从 8 版本开始就支持一个应用同时连接多个 Redis 实例不同连接串、不同配置并配合 .NET 8 的Keyed Services实现按名称直接注入对应的 Redis 客户端多缓存、多会话等场景一步到位。 官方文档入口doc/multipleServers.md、doc/dependency-injection.md为什么需要一个应用连多个Redis常见场景缓存、会话、分布式锁分别落在不同的 Redis 实例上——它们不是主从关系而是连接串不同、配置不同的独立实例。手动管理多组ConnectionMultiplexer很痛苦要自己维护多个客户端、区分默认实例、还要处理各自的重连。而本库把这件事简化为注册多份RedisConfiguration然后按名字取用。核心规则只有两条对应 RedisConfiguration.cs 中的两个属性属性作用Name实例的唯一标识名Keyed Services 就靠它解析IsDefault标记默认实例整个应用有且只能有一个每个命名配置都拥有独立的连接池实例之间互不干扰。多实例注册一次调用搞定在 IServiceCollectionExtensions.cs 中AddStackExchangeRedisExtensionsT(configurations)接收一个RedisConfiguration数组即可。要点每份配置填好Hosts地址端口、KeyPrefix键前缀、PoolSize等给第二份配置起Name如session并给其中一份设IsDefault true其余配置全部走默认服务注入无需任何额外代码。配置项的完整含义可参考 doc/configuration/c-configuration.md也支持从appsettings.json绑定见 doc/configuration/json-configuration.md。RedisClientFactoryRedisClientFactory.cs注册时会做严格校验只允许一个IsDefault、Name必须唯一且至少一份配置必须是默认——配置错误会在启动时就抛出异常而不是运行到一半才发现问题。如何按名称解析Keyed Services.NET 8 首选当配置带有Name时库会自动注册IRedisClient和IRedisDatabase的 keyed 单例。在你的服务里直接写public class MyService( [FromKeyedServices(cache)] IRedisDatabase cacheDb, [FromKeyedServices(session)] IRedisDatabase sessionDb) { public async Task Example() { await cacheDb.AddAsync(key, value); await sessionDb.AddAsync(session:abc, sessionData); } }Minimal API 里同样适用app.MapGet(/data, async ([FromKeyedServices(cache)] IRedisDatabase redis) await redis.GetAsyncMyData(key));不想按名字注入、想显式获取时用IRedisClientFactory老 TFM 也能用public class MyClass(IRedisClientFactory clientFactory) { public Task MyMethod() { var redisClient clientFactory.GetRedisClient(session); var db redisClient.GetDefaultDatabase(); // do your stuff here } }两种方式解析到的是同一个底层IRedisClient实例选哪种取决于你的框架版本和代码风格。⚠️ 注意Keyed Services 只在直接传RedisConfiguration数组的重载中生效。若使用FuncIServiceProvider, IEnumerableRedisConfiguration工厂重载配置名在注册期未知不会注册 keyed 服务——此时请走IRedisClientFactory。常见踩坑清单忘了设IsDefault启动即抛异常至少需要一个默认配置设了两个IsDefault同样启动报错只允许一个Name为空工厂会自动补一个 GUID 并写警告日志但你就再也按名字取不到它了Name重复直接抛ArgumentException用工厂重载却想用[FromKeyedServices]解析结果为null参考 KeyedDiTests.cs 中的用例可看到各种场景的完整行为断言。相关文件速查多服务器用法doc/multipleServers.md依赖注入说明doc/dependency-injection.mdKeyed 服务注册逻辑IServiceCollectionExtensions.cs客户端工厂与校验规则RedisClientFactory.cs配置模型Name/IsDefaultRedisConfiguration.cs单元测试KeyedDiTests.cs小结一句话记住多份RedisConfiguration 唯一Name 一个IsDefault.NET 8 用[FromKeyedServices]按名字注入旧版本用IRedisClientFactory显式获取。无需手写多路连接管理多实例 Redis 就这么简单、快速又可靠。【免费下载链接】StackExchange.Redis.ExtensionsStackExchange.Redis.Extensions is a library that extends StackExchange.Redis, making it easier to work with Redis in .NET applications项目地址: https://gitcode.com/gh_mirrors/st/StackExchange.Redis.Extensions创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价