Skip to content

Commit d17c5c9

Browse files
committed
fix: use backing ibufferdistributedcache
1 parent ea7d7cd commit d17c5c9

File tree

5 files changed

+135
-29
lines changed

5 files changed

+135
-29
lines changed

labs/MessagingRedisCache/Program.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
using Microsoft.Extensions.Caching.Hybrid;
22
using Microsoft.Extensions.DependencyInjection;
3-
using Microsoft.Extensions.Logging;
43

54
var services = new ServiceCollection();
6-
services.AddLogging(builder => builder.AddConsole().AddFilter(null, LogLevel.Trace));
75
services.AddHybridCache();
86
services.AddMessagingRedisCache(options =>
97
{
@@ -34,5 +32,3 @@ await hybridCache
3432
cancellationToken =>
3533
ValueTask.FromResult<string?>(null))
3634
.ConfigureAwait(false);
37-
38-
var test = "";

src/L1L2RedisCache/L1L2RedisCache.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ namespace L1L2RedisCache;
1212
/// A distributed cache implementation using both memory and Redis.
1313
/// </summary>
1414
public class L1L2RedisCache(
15+
IBufferDistributedCache bufferDistributedCache,
1516
IMemoryCache l1Cache,
1617
IMessagePublisher messagePublisher,
1718
IMessageSubscriber messageSubscriber,
1819
IMessagingConfigurationVerifier messagingConfigurationVerifier,
1920
IOptions<MessagingRedisCacheOptions> messagingRedisCacheOptionsAccessor,
2021
ILogger<L1L2RedisCache>? logger = null) :
2122
MessagingRedisCache.MessagingRedisCache(
23+
bufferDistributedCache,
2224
messagePublisher,
2325
messageSubscriber,
2426
messagingConfigurationVerifier,

src/MessagingRedisCache/Configuration/ServiceCollectionExtensions.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using MessagingRedisCache;
22
using Microsoft.Extensions.Caching.Distributed;
3+
using Microsoft.Extensions.Caching.StackExchangeRedis;
34
using Microsoft.Extensions.DependencyInjection.Extensions;
45
using Microsoft.Extensions.Options;
56
using StackExchange.Redis;
@@ -46,6 +47,15 @@ public static IMessagingRedisCacheBuilder AddMessagingRedisCache(
4647
}
4748
}
4849
});
50+
services.AddSingleton<IBufferDistributedCache, RedisCache>(
51+
serviceProvider =>
52+
new RedisCache(
53+
serviceProvider
54+
.GetRequiredService<IOptions<MessagingRedisCacheOptions>>()));
55+
services.AddSingleton(
56+
serviceProvider => new Func<IDistributedCache>(
57+
() => new RedisCache(
58+
serviceProvider.GetRequiredService<IOptions<MessagingRedisCacheOptions>>())));
4959
services.TryAddSingleton<IDistributedCache, MessagingRedisCache.MessagingRedisCache>();
5060
services.TryAddSingleton<IMessagingConfigurationVerifier, MessagingConfigurationVerifier>();
5161

src/MessagingRedisCache/MessagingRedisCache.cs

Lines changed: 120 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
1-
using System.Buffers;
2-
using Microsoft.Extensions.Caching.Distributed;
1+
using Microsoft.Extensions.Caching.Distributed;
32
using Microsoft.Extensions.Caching.StackExchangeRedis;
43
using Microsoft.Extensions.Logging;
54
using Microsoft.Extensions.Logging.Abstractions;
65
using Microsoft.Extensions.Options;
76
using StackExchange.Redis;
7+
using System.Buffers;
88

99
namespace MessagingRedisCache;
1010

1111
/// <summary>
1212
/// A Redis distributed cache implementation that uses pub/sub.
1313
/// </summary>
1414
public class MessagingRedisCache :
15-
RedisCache,
16-
IBufferDistributedCache
15+
IBufferDistributedCache,
16+
IDisposable
1717
{
1818
/// <summary>
1919
/// Initializes a new instance of MessagingRedisCache.
2020
/// </summary>
2121
public MessagingRedisCache(
22+
IBufferDistributedCache bufferDistributedCache,
2223
IMessagePublisher messagePublisher,
2324
IMessageSubscriber messageSubscriber,
2425
IMessagingConfigurationVerifier messagingConfigurationVerifier,
2526
IOptions<MessagingRedisCacheOptions> messagingRedisCacheOptionsAccessor,
26-
ILogger<MessagingRedisCache>? logger = null) :
27-
base(messagingRedisCacheOptionsAccessor)
27+
ILogger<MessagingRedisCache>? logger = null)
2828
{
29+
BufferDistributedCache = bufferDistributedCache ??
30+
throw new ArgumentNullException(
31+
nameof(bufferDistributedCache));
2932
Logger = logger ??
3033
NullLogger<MessagingRedisCache>.Instance;
3134
MessagePublisher = messagePublisher ??
@@ -56,6 +59,11 @@ public MessagingRedisCache(
5659
SubscribeCancellationTokenSource.Token);
5760
}
5861

62+
/// <summary>
63+
/// The backing <c>IBufferDistributedCache</c>, implemented by <see cref="RedisCache"/>.
64+
/// </summary>
65+
public IBufferDistributedCache BufferDistributedCache { get; }
66+
5967
/// <summary>
6068
/// The <c>StackExchange.Redis.IDatabase</c> for the <see cref="RedisCache"/>.
6169
/// </summary>
@@ -90,29 +98,69 @@ public MessagingRedisCache(
9098
private CancellationTokenSource SubscribeCancellationTokenSource { get; set; }
9199

92100
/// <inheritdoc />
93-
public new void Dispose()
101+
public void Dispose()
94102
{
95-
base.Dispose();
96103
Dispose(true);
104+
GC.SuppressFinalize(this);
105+
}
106+
107+
/// <inheritdoc />
108+
public byte[]? Get(string key)
109+
{
110+
return BufferDistributedCache
111+
.Get(key);
112+
}
113+
114+
/// <inheritdoc />
115+
public async Task<byte[]?> GetAsync(
116+
string key,
117+
CancellationToken token = default)
118+
{
119+
return await BufferDistributedCache
120+
.GetAsync(
121+
key,
122+
token)
123+
.ConfigureAwait(false);
97124
}
98125

99126
/// <inheritdoc />
100-
public new void Remove(string key)
127+
public void Refresh(string key)
101128
{
102-
base.Remove(key);
129+
BufferDistributedCache
130+
.Refresh(key);
131+
}
132+
133+
/// <inheritdoc />
134+
public async Task RefreshAsync(
135+
string key,
136+
CancellationToken token = default)
137+
{
138+
await BufferDistributedCache
139+
.RefreshAsync(
140+
key,
141+
token)
142+
.ConfigureAwait(false);
143+
}
144+
145+
/// <inheritdoc />
146+
public void Remove(string key)
147+
{
148+
BufferDistributedCache
149+
.Remove(key);
103150
MessagePublisher.Publish(
104151
Database.Value.Multiplexer,
105152
key);
106153
}
107154

108155
/// <inheritdoc />
109-
public new async Task RemoveAsync(
156+
public async Task RemoveAsync(
110157
string key,
111158
CancellationToken token = default)
112159
{
113-
await base.RemoveAsync(
114-
key,
115-
token)
160+
await BufferDistributedCache
161+
.RemoveAsync(
162+
key,
163+
token)
116164
.ConfigureAwait(false);
117165
await MessagePublisher
118166
.PublishAsync(
@@ -123,12 +171,12 @@ await MessagePublisher
123171
}
124172

125173
/// <inheritdoc />
126-
public new void Set(
174+
public void Set(
127175
string key,
128176
byte[] value,
129177
DistributedCacheEntryOptions options)
130178
{
131-
base.Set(
179+
BufferDistributedCache.Set(
132180
key,
133181
value,
134182
options);
@@ -143,24 +191,28 @@ public void Set(
143191
ReadOnlySequence<byte> value,
144192
DistributedCacheEntryOptions options)
145193
{
146-
((IBufferDistributedCache)this).Set(key, value, options);
194+
BufferDistributedCache.Set(
195+
key,
196+
value,
197+
options);
147198
MessagePublisher.Publish(
148199
Database.Value.Multiplexer,
149200
key);
150201
}
151202

152203
/// <inheritdoc />
153-
public new async Task SetAsync(
204+
public async Task SetAsync(
154205
string key,
155206
byte[] value,
156207
DistributedCacheEntryOptions options,
157208
CancellationToken token = default)
158209
{
159-
await base.SetAsync(
160-
key,
161-
value,
162-
options,
163-
token)
210+
await BufferDistributedCache
211+
.SetAsync(
212+
key,
213+
value,
214+
options,
215+
token)
164216
.ConfigureAwait(false);
165217
await MessagePublisher
166218
.PublishAsync(
@@ -170,7 +222,51 @@ await MessagePublisher
170222
.ConfigureAwait(false);
171223
}
172224

173-
private void Dispose(bool isDisposing)
225+
public async ValueTask SetAsync(
226+
string key,
227+
ReadOnlySequence<byte> value,
228+
DistributedCacheEntryOptions options,
229+
CancellationToken token = default)
230+
{
231+
await BufferDistributedCache
232+
.SetAsync(
233+
key,
234+
value,
235+
options,
236+
token)
237+
.ConfigureAwait(false);
238+
await MessagePublisher
239+
.PublishAsync(
240+
Database.Value.Multiplexer,
241+
key,
242+
token)
243+
.ConfigureAwait(false);
244+
}
245+
246+
public bool TryGet(
247+
string key,
248+
IBufferWriter<byte> destination)
249+
{
250+
return BufferDistributedCache
251+
.TryGet(
252+
key,
253+
destination);
254+
}
255+
256+
public async ValueTask<bool> TryGetAsync(
257+
string key,
258+
IBufferWriter<byte> destination,
259+
CancellationToken token = default)
260+
{
261+
return await BufferDistributedCache
262+
.TryGetAsync(
263+
key,
264+
destination,
265+
token)
266+
.ConfigureAwait(false);
267+
}
268+
269+
protected virtual void Dispose(bool isDisposing)
174270
{
175271
if (IsDisposed)
176272
{

tests/MessagingRedisCache/Unit/MessagingRedisCacheTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ public MessagingRedisCacheTests()
1919

2020
var database = Substitute
2121
.For<IDatabase>();
22-
2322
ConnectionMultiplexer = Substitute
2423
.For<IConnectionMultiplexer>();
2524
ConnectionMultiplexer
@@ -57,7 +56,10 @@ public MessagingRedisCacheTests()
5756
Arg.Any<IDatabase>(),
5857
Arg.Any<CancellationToken>());
5958

59+
var bufferDistributedCache = Substitute
60+
.For<IBufferDistributedCache>();
6061
MessagingRedisCache = new MessagingRedisCache(
62+
bufferDistributedCache,
6163
MessagePublisher,
6264
MessageSubscriber,
6365
messagingConfigurationVerifier,

0 commit comments

Comments
 (0)