Skip to content

Commit ec74c00

Browse files
authored
Add redis database selection (#101)
* Add redis database selection * Add db selection for queue * Rename DbId property to Database Database property is no longer nullable and its default value is set to -1 The UseDatabase methods checks if the database identifier is valid Remove _dbId and replace it with _options.Database * Add database identifier validation in cluster mode * Forget the files 😅 * Remove check for cluster mode config related to database identifier.
1 parent 3119e54 commit ec74c00

6 files changed

Lines changed: 52 additions & 8 deletions

File tree

src/Foundatio.Redis/Cache/RedisCacheClient.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,17 @@ public RedisCacheClient(RedisCacheClientOptions options)
3535
_timeProvider = options.TimeProvider ?? TimeProvider.System;
3636
options.Serializer ??= DefaultSerializer.Instance;
3737
_logger = options.LoggerFactory?.CreateLogger(typeof(RedisCacheClient)) ?? NullLogger.Instance;
38+
3839
options.ConnectionMultiplexer.ConnectionRestored += ConnectionMultiplexerOnConnectionRestored;
3940
}
4041

4142
public RedisCacheClient(Builder<RedisCacheClientOptionsBuilder, RedisCacheClientOptions> config)
4243
: this(config(new RedisCacheClientOptionsBuilder()).Build())
4344
{
45+
4446
}
4547

46-
public IDatabase Database => _options.ConnectionMultiplexer.GetDatabase();
48+
public IDatabase Database => _options.ConnectionMultiplexer.GetDatabase(_options.Database);
4749

4850
public Task<bool> RemoveAsync(string key)
4951
{
@@ -84,8 +86,8 @@ public async Task<int> RemoveAllAsync(IEnumerable<string> keys = null)
8486

8587
try
8688
{
87-
long dbSize = await server.DatabaseSizeAsync().AnyContext();
88-
await server.FlushDatabaseAsync().AnyContext();
89+
long dbSize = await server.DatabaseSizeAsync(_options.Database).AnyContext();
90+
await server.FlushDatabaseAsync(_options.Database).AnyContext();
8991
deleted += dbSize;
9092
continue;
9193
}
@@ -100,7 +102,7 @@ public async Task<int> RemoveAllAsync(IEnumerable<string> keys = null)
100102
// A Performance win could be had if we are sure dbSize didn't fail and we know nothing was changing
101103
// keys while we were deleting.
102104
var seen = new HashSet<RedisKey>();
103-
await foreach (var key in server.KeysAsync().ConfigureAwait(false))
105+
await foreach (var key in server.KeysAsync(_options.Database).ConfigureAwait(false))
104106
seen.Add(key);
105107

106108
foreach (var batch in seen.Batch(batchSize))

src/Foundatio.Redis/Cache/RedisCacheClientOptions.cs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using StackExchange.Redis;
1+
using System;
2+
using StackExchange.Redis;
23

34
namespace Foundatio.Caching;
45

@@ -16,6 +17,10 @@ public class RedisCacheClientOptions : SharedOptions
1617
/// </summary>
1718
public CommandFlags ReadMode { get; set; } = CommandFlags.None;
1819

20+
/// <summary>
21+
/// The database to use
22+
/// </summary>
23+
public int Database { get; set; } = -1;
1924
}
2025

2126
public class RedisCacheClientOptionsBuilder : SharedOptionsBuilder<RedisCacheClientOptions, RedisCacheClientOptionsBuilder>
@@ -37,4 +42,15 @@ public RedisCacheClientOptionsBuilder ReadMode(CommandFlags commandFlags)
3742
Target.ReadMode = commandFlags;
3843
return this;
3944
}
45+
46+
public RedisCacheClientOptionsBuilder UseDatabase(int database)
47+
{
48+
if (database < -1) // We consider -1 as a valid value in respect for the default behaviour of stack exchange redis
49+
{
50+
throw new ArgumentOutOfRangeException(nameof(database), "database number cannot be less than -1.");
51+
}
52+
53+
Target.Database = database;
54+
return this;
55+
}
4056
}

src/Foundatio.Redis/Cache/RedisHybridCacheClient.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ public RedisHybridCacheClient(RedisHybridCacheClientOptions options, InMemoryCac
99
.Serializer(options.Serializer)
1010
.LoggerFactory(options.LoggerFactory)
1111
.ShouldThrowOnSerializationError(options.ShouldThrowOnSerializationError)
12-
.ReadMode(options.ReadMode)),
12+
.ReadMode(options.ReadMode)
13+
.UseDatabase(options.Database)),
1314
new RedisMessageBus(o => o
1415
.Subscriber(options.ConnectionMultiplexer.GetSubscriber())
1516
.Topic(options.RedisChannelName)

src/Foundatio.Redis/Cache/RedisHybridCacheClientOptions.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using StackExchange.Redis;
1+
using System;
2+
using StackExchange.Redis;
23

34
namespace Foundatio.Caching;
45

@@ -28,4 +29,15 @@ public RedisHybridCacheClientOptionsBuilder ShouldThrowOnSerializationError(bool
2829
Target.ShouldThrowOnSerializationError = shouldThrow;
2930
return this;
3031
}
32+
33+
public RedisHybridCacheClientOptionsBuilder UseDatabase(int database)
34+
{
35+
if (database < -1) // We consider -1 as a valid value in respect for the default behaviour of stack exchange redis
36+
{
37+
throw new ArgumentOutOfRangeException(nameof(database), "database number cannot be less than 0.");
38+
}
39+
40+
Target.Database = database;
41+
return this;
42+
}
3143
}

src/Foundatio.Redis/Queues/RedisQueue.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public RedisQueue(RedisQueueOptions<T> options) : base(options)
4444
throw new ArgumentException("ConnectionMultiplexer is required.");
4545

4646
options.ConnectionMultiplexer.ConnectionRestored += ConnectionMultiplexerOnConnectionRestored;
47+
4748
_cache = new RedisCacheClient(new RedisCacheClientOptions { ConnectionMultiplexer = options.ConnectionMultiplexer, Serializer = _serializer });
4849

4950
_payloadTimeToLive = GetPayloadTtl();
@@ -65,7 +66,7 @@ public RedisQueue(RedisQueueOptions<T> options) : base(options)
6566
public RedisQueue(Builder<RedisQueueOptionsBuilder<T>, RedisQueueOptions<T>> config)
6667
: this(config(new RedisQueueOptionsBuilder<T>()).Build()) { }
6768

68-
public IDatabase Database => _options.ConnectionMultiplexer.GetDatabase();
69+
public IDatabase Database => _options.ConnectionMultiplexer.GetDatabase(_options.Database);
6970

7071
protected override Task EnsureQueueCreatedAsync(CancellationToken cancellationToken = default) => Task.CompletedTask;
7172

src/Foundatio.Redis/Queues/RedisQueueOptions.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ public class RedisQueueOptions<T> : SharedQueueOptions<T> where T : class
1212
public TimeSpan DeadLetterTimeToLive { get; set; } = TimeSpan.FromDays(1);
1313
public int DeadLetterMaxItems { get; set; } = 100;
1414
public bool RunMaintenanceTasks { get; set; } = true;
15+
public int Database { get; set; } = -1;
1516
}
1617

1718
public class RedisQueueOptionsBuilder<T> : SharedQueueOptionsBuilder<T, RedisQueueOptions<T>, RedisQueueOptionsBuilder<T>> where T : class
@@ -51,4 +52,15 @@ public RedisQueueOptionsBuilder<T> RunMaintenanceTasks(bool runMaintenanceTasks)
5152
Target.RunMaintenanceTasks = runMaintenanceTasks;
5253
return this;
5354
}
55+
56+
public RedisQueueOptionsBuilder<T> UseDatabase(int database)
57+
{
58+
if (database < -1) // We consider -1 as a valid value in respect for the default behaviour of stack exchange redis
59+
{
60+
throw new ArgumentOutOfRangeException(nameof(database), "database number cannot be less than 0.");
61+
}
62+
63+
Target.Database = database;
64+
return this;
65+
}
5466
}

0 commit comments

Comments
 (0)