Skip to content

Commit 949efac

Browse files
authored
Fixed GetOrSet redis read. (#25)
* Fixed GetOrSet redis read. * Changed implementation to avoid feedbackup/notification loop. Thanks @JoelNygren-Norce!
1 parent 00e66ab commit 949efac

File tree

3 files changed

+44
-7
lines changed

3 files changed

+44
-7
lines changed

RedisBackedHzCache/RedisBackedHzCache.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,23 @@ public void Set<T>(string key, T value, TimeSpan ttl)
219219

220220
public T GetOrSet<T>(string key, Func<string, T> valueFactory, TimeSpan ttl, long maxMsToWaitForFactory = 10000)
221221
{
222+
var value = hzCache.Get<T>(key);
223+
if (value != null)
224+
{
225+
return value;
226+
}
227+
228+
if (options.useRedisAs2ndLevelCache)
229+
{
230+
var redisValue = GetRedisValue(key);
231+
if (!redisValue.IsNull)
232+
{
233+
var ttlValue = TTLValue.FromRedisValue<T>(Encoding.ASCII.GetBytes(redisValue.ToString()));
234+
hzCache.SetRaw(key, ttlValue);
235+
return (T)ttlValue.value;
236+
}
237+
}
238+
222239
return hzCache.GetOrSet(key, valueFactory, ttl, maxMsToWaitForFactory);
223240
}
224241

@@ -229,7 +246,8 @@ public IList<T> GetOrSetBatch<T>(IList<string> keys, Func<IList<string>, List<Ke
229246

230247
public IList<T> GetOrSetBatch<T>(IList<string> keys, Func<IList<string>, List<KeyValuePair<string, T>>> valueFactory, TimeSpan ttl)
231248
{
232-
using var activity = HzActivities.Source.StartActivityWithCommonTags(HzActivities.Names.GetOrSetBatch, HzActivities.Area.RedisBackedHzCache, key: string.Join(",", keys ?? new List<string>()));
249+
using var activity = HzActivities.Source.StartActivityWithCommonTags(HzActivities.Names.GetOrSetBatch, HzActivities.Area.RedisBackedHzCache,
250+
key: string.Join(",", keys ?? new List<string>()));
233251
Func<IList<string>, List<KeyValuePair<string, T>>> redisFactory = idList =>
234252
{
235253
// Create a list of redis keys from the list of cache keys

RedisBackedHzCache/RedisBackedHzCacheAsync.cs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,26 @@ public Task SetAsync<T>(string key, T value, TimeSpan ttl)
5555
return hzCache.SetAsync(key, value, ttl);
5656
}
5757

58-
public Task<T> GetOrSetAsync<T>(string key, Func<string, Task<T>> valueFactory, TimeSpan ttl, long maxMsToWaitForFactory = 10000)
58+
public async Task<T> GetOrSetAsync<T>(string key, Func<string, Task<T>> valueFactory, TimeSpan ttl, long maxMsToWaitForFactory = 10000)
5959
{
60-
return hzCache.GetOrSetAsync(key, valueFactory, ttl, maxMsToWaitForFactory);
60+
var value = await hzCache.GetAsync<T>(key);
61+
if (value != null)
62+
{
63+
return value;
64+
}
65+
66+
if (options.useRedisAs2ndLevelCache)
67+
{
68+
var redisValue = await GetRedisValueAsync(key);
69+
if (!redisValue.IsNull)
70+
{
71+
var ttlValue = await TTLValue.FromRedisValueAsync<T>(Encoding.ASCII.GetBytes(redisValue.ToString()));
72+
hzCache.SetRaw(key, ttlValue);
73+
return (T)ttlValue.value;
74+
}
75+
}
76+
77+
return await hzCache.GetOrSetAsync(key, valueFactory, ttl, maxMsToWaitForFactory);
6178
}
6279

6380
public Task<IList<T>> GetOrSetBatchAsync<T>(IList<string> keys, Func<IList<string>, Task<List<KeyValuePair<string, T>>>> valueFactory)
@@ -67,7 +84,8 @@ public Task<IList<T>> GetOrSetBatchAsync<T>(IList<string> keys, Func<IList<strin
6784

6885
public async Task<IList<T>> GetOrSetBatchAsync<T>(IList<string> keys, Func<IList<string>, Task<List<KeyValuePair<string, T>>>> valueFactory, TimeSpan ttl)
6986
{
70-
using var activity = HzActivities.Source.StartActivityWithCommonTags(HzActivities.Names.GetOrSetBatch, HzActivities.Area.RedisBackedHzCache, async: true, key: string.Join(",", keys ?? new List<string>()));
87+
using var activity = HzActivities.Source.StartActivityWithCommonTags(HzActivities.Names.GetOrSetBatch, HzActivities.Area.RedisBackedHzCache, async: true,
88+
key: string.Join(",", keys ?? new List<string>()));
7189
Func<IList<string>, Task<List<KeyValuePair<string, T>>>> redisFactory = async idList =>
7290
{
7391
// Create a list of redis keys from the list of cache keys
@@ -127,4 +145,4 @@ public Task<bool> RemoveAsync(string key)
127145
return hzCache.RemoveAsync(key);
128146
}
129147
}
130-
}
148+
}

UnitTests/IntegrationTests.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,10 +298,11 @@ public async Task TestRedisGetOrSet()
298298
var v1 = c1.GetOrSet("1", _ => new Mocko(10), TimeSpan.FromMinutes(1));
299299
Assert.IsNotNull(v1);
300300
Assert.IsTrue(c1.Get<Mocko>("1").num == 10);
301-
await Task.Delay(100);
302-
var c21 = await c2.GetAsync<Mocko>("1");
301+
await Task.Delay(200);
302+
var c21 = await c2.GetOrSetAsync("1", _ => Task.FromResult(new Mocko(20)), TimeSpan.FromMinutes(1));
303303
Assert.IsTrue(c21.num == 10);
304304
Assert.IsTrue(c21.guid != v1.guid);
305+
await c1.RemoveAsync("1");
305306
}
306307

307308

0 commit comments

Comments
 (0)