Skip to content

Commit

Permalink
added cache read mode to redis client options
Browse files Browse the repository at this point in the history
reverted default read mode back to none from replica as the change breaks code relying on read value existing immediately after writing (RedisQueue for example)
  • Loading branch information
itai-langer-cobwebs committed Dec 14, 2023
1 parent f25c819 commit b3f23d3
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
8 changes: 4 additions & 4 deletions src/Foundatio.Redis/Cache/RedisCacheClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public async Task<CacheValue<T>> GetAsync<T>(string key) {
if (String.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key), "Key cannot be null or empty.");

var redisValue = await Database.StringGetAsync(key, CommandFlags.PreferReplica).AnyContext();
var redisValue = await Database.StringGetAsync(key, _options.ReadMode).AnyContext();
return RedisValueToCacheValue<T>(redisValue);
}

Expand Down Expand Up @@ -149,7 +149,7 @@ private CacheValue<T> RedisValueToCacheValue<T>(RedisValue redisValue) {

public async Task<IDictionary<string, CacheValue<T>>> GetAllAsync<T>(IEnumerable<string> keys) {
string[] keyArray = keys.ToArray();
var values = await Database.StringGetAsync(keyArray.Select(k => (RedisKey)k).ToArray(), CommandFlags.PreferReplica).AnyContext();
var values = await Database.StringGetAsync(keyArray.Select(k => (RedisKey)k).ToArray(), _options.ReadMode).AnyContext();

var result = new Dictionary<string, CacheValue<T>>();
for (int i = 0; i < keyArray.Length; i++)
Expand All @@ -166,12 +166,12 @@ public async Task<CacheValue<ICollection<T>>> GetListAsync<T>(string key, int? p
throw new ArgumentNullException(nameof(page), "Page cannot be less than 1.");

if (!page.HasValue) {
var set = await Database.SortedSetRangeByScoreAsync(key, flags: CommandFlags.PreferReplica).AnyContext();
var set = await Database.SortedSetRangeByScoreAsync(key, flags: _options.ReadMode).AnyContext();
return RedisValuesToCacheValue<T>(set);
} else {
long start = ((page.Value - 1) * pageSize);
long end = start + pageSize - 1;
var set = await Database.SortedSetRangeByRankAsync(key, start, end, flags: CommandFlags.PreferReplica).AnyContext();
var set = await Database.SortedSetRangeByRankAsync(key, start, end, flags: _options.ReadMode).AnyContext();
return RedisValuesToCacheValue<T>(set);
}
}
Expand Down
5 changes: 5 additions & 0 deletions src/Foundatio.Redis/Cache/RedisCacheClientOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ public class RedisCacheClientOptions : SharedOptions {
/// </summary>
public bool ShouldThrowOnSerializationError { get; set; } = true;

/// <summary>
/// The behaviour required when performing read operations from cache
/// </summary>
public CommandFlags ReadMode { get; set; } = CommandFlags.None;

}

public class RedisCacheClientOptionsBuilder : SharedOptionsBuilder<RedisCacheClientOptions, RedisCacheClientOptionsBuilder> {
Expand Down

0 comments on commit b3f23d3

Please sign in to comment.