mirror of
https://github.com/bitwarden/server
synced 2025-12-24 12:13:17 +00:00
Upgrade ExtendedCache to support non-Redis distributed cache (#6682)
* Upgrade ExtendedCache to support non-Redis distributed cache * Update CACHING.md to use UseSharedDistributedCache setting Updated documentation to reflect the setting rename from UseSharedRedisCache to UseSharedDistributedCache in the ExtendedCache configuration examples. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> Co-authored-by: Matt Bishop <withinfocus@users.noreply.github.com>
This commit is contained in:
@@ -732,7 +732,7 @@ public class GlobalSettings : IGlobalSettings
|
||||
public class ExtendedCacheSettings
|
||||
{
|
||||
public bool EnableDistributedCache { get; set; } = true;
|
||||
public bool UseSharedRedisCache { get; set; } = true;
|
||||
public bool UseSharedDistributedCache { get; set; } = true;
|
||||
public IConnectionStringSettings Redis { get; set; } = new ConnectionStringSettings();
|
||||
public TimeSpan Duration { get; set; } = TimeSpan.FromMinutes(30);
|
||||
public bool IsFailSafeEnabled { get; set; } = true;
|
||||
|
||||
@@ -140,7 +140,7 @@ services.AddExtendedCache("MyFeatureCache", globalSettings, new GlobalSettings.E
|
||||
// Option 4: Isolated Redis for specialized features
|
||||
services.AddExtendedCache("SpecializedCache", globalSettings, new GlobalSettings.ExtendedCacheSettings
|
||||
{
|
||||
UseSharedRedisCache = false,
|
||||
UseSharedDistributedCache = false,
|
||||
Redis = new GlobalSettings.ConnectionStringSettings
|
||||
{
|
||||
ConnectionString = "localhost:6379,ssl=false"
|
||||
|
||||
@@ -18,9 +18,12 @@ public static class ExtendedCacheServiceCollectionExtensions
|
||||
/// Adds a new, named Fusion Cache <see href="https://github.com/ZiggyCreatures/FusionCache"/> to the service
|
||||
/// collection. If an existing cache of the same name is found, it will do nothing.<br/>
|
||||
/// <br/>
|
||||
/// <b>Note</b>: When re-using the existing Redis cache, it is expected to call this method <b>after</b> calling
|
||||
/// <code>services.AddDistributedCache(globalSettings)</code><br />This ensures that DI correctly finds,
|
||||
/// configures, and re-uses all the shared Redis architecture.
|
||||
/// <b>Note</b>: When re-using an existing distributed cache, it is expected to call this method <b>after</b> calling
|
||||
/// <code>services.AddDistributedCache(globalSettings)</code><br />This ensures that DI correctly finds
|
||||
/// and re-uses the shared distributed cache infrastructure.<br />
|
||||
/// <br />
|
||||
/// <b>Backplane</b>: Cross-instance cache invalidation is only available when using Redis.
|
||||
/// Non-Redis distributed caches operate with eventual consistency across multiple instances.
|
||||
/// </summary>
|
||||
public static IServiceCollection AddExtendedCache(
|
||||
this IServiceCollection services,
|
||||
@@ -72,12 +75,21 @@ public static class ExtendedCacheServiceCollectionExtensions
|
||||
if (!settings.EnableDistributedCache)
|
||||
return services;
|
||||
|
||||
if (settings.UseSharedRedisCache)
|
||||
if (settings.UseSharedDistributedCache)
|
||||
{
|
||||
// Using Shared Redis, TryAdd and reuse all pieces (multiplexer, distributed cache and backplane)
|
||||
|
||||
if (!CoreHelpers.SettingHasValue(globalSettings.DistributedCache.Redis.ConnectionString))
|
||||
{
|
||||
// Using Shared Non-Redis Distributed Cache:
|
||||
// 1. Assume IDistributedCache is already registered (e.g., Cosmos, SQL Server)
|
||||
// 2. Backplane not supported (Redis-only feature, requires pub/sub)
|
||||
|
||||
fusionCacheBuilder
|
||||
.TryWithRegisteredDistributedCache();
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
// Using Shared Redis, TryAdd and reuse all pieces (multiplexer, distributed cache and backplane)
|
||||
|
||||
services.TryAddSingleton<IConnectionMultiplexer>(sp =>
|
||||
CreateConnectionMultiplexer(sp, cacheName, globalSettings.DistributedCache.Redis.ConnectionString));
|
||||
@@ -92,13 +104,13 @@ public static class ExtendedCacheServiceCollectionExtensions
|
||||
});
|
||||
|
||||
services.TryAddSingleton<IFusionCacheBackplane>(sp =>
|
||||
{
|
||||
var mux = sp.GetRequiredService<IConnectionMultiplexer>();
|
||||
return new RedisBackplane(new RedisBackplaneOptions
|
||||
{
|
||||
var mux = sp.GetRequiredService<IConnectionMultiplexer>();
|
||||
return new RedisBackplane(new RedisBackplaneOptions
|
||||
{
|
||||
ConnectionMultiplexerFactory = () => Task.FromResult(mux)
|
||||
});
|
||||
ConnectionMultiplexerFactory = () => Task.FromResult(mux)
|
||||
});
|
||||
});
|
||||
|
||||
fusionCacheBuilder
|
||||
.WithRegisteredDistributedCache()
|
||||
@@ -107,10 +119,21 @@ public static class ExtendedCacheServiceCollectionExtensions
|
||||
return services;
|
||||
}
|
||||
|
||||
// Using keyed Redis / Distributed Cache. Create all pieces as keyed services.
|
||||
// Using keyed Distributed Cache. Create/Reuse all pieces as keyed services.
|
||||
|
||||
if (!CoreHelpers.SettingHasValue(settings.Redis.ConnectionString))
|
||||
{
|
||||
// Using Keyed Non-Redis Distributed Cache:
|
||||
// 1. Assume IDistributedCache (e.g., Cosmos, SQL Server) is already registered with cacheName as key
|
||||
// 2. Backplane not supported (Redis-only feature, requires pub/sub)
|
||||
|
||||
fusionCacheBuilder
|
||||
.TryWithRegisteredKeyedDistributedCache(serviceKey: cacheName);
|
||||
|
||||
return services;
|
||||
}
|
||||
|
||||
// Using Keyed Redis: TryAdd and reuse all pieces (multiplexer, distributed cache and backplane)
|
||||
|
||||
services.TryAddKeyedSingleton<IConnectionMultiplexer>(
|
||||
cacheName,
|
||||
|
||||
Reference in New Issue
Block a user