使用StackExchange.Redis客户端更新Redis缓存中的字典对象

3

我正在使用Azure Redis缓存和StackExchange.redis客户端进行访问。我正试图找出在Redis中更新字典值的最佳方法。

public async Task<T> FetchAndCacheAsync<T>(string key, Func<Task<T>> retrieveData, TimeSpan absoluteExpiry)
        {
            T value;

            var output = await _cache.StringGetAsync(key);
            if (output.HasValue)
            {
                value = _serializer.Deserialize<T>(output);
            }
            else
            {
                value = await retrieveData();
                await _cache.StringSetAsync(key, _serializer.Serialize(value), absoluteExpiry);
            }

            return value;
        }

上面的代码片段中的_cache是StackExchange.Redis.IDatabase类型。

初始化时,我将字典对象存储为

FetchAndCacheAsync("diagnostics", () => new Dictionary());

我有一个函数会频繁调用,用于更新字典对象中给定键的DateTime值。

问题:根据我对Redis缓存的基本了解,我只能想到以下方式来更新存储在Redis缓存中的字典中的特定键值。

var diagnostics = FetchAndCacheAsync("diagnostics", () => new Dictionary<Guid, DateTime>());

diagnostics[key] = value;
_cache.KeyDeleteAsync("diagnostics");

FetchAndCacheAsync("diagnostics", () => diagnostics);

但是我认为这样不太对。我相信一定有更好的方法来解决这个问题。您有什么建议吗?

@MarcGravell,非常感谢您对此的见解。谢谢。 - souser
1个回答

4

你看过 Redis 支持的哈希数据结构吗?

http://redis.io/topics/data-types-intro#hashes

IDatabase.HashGet("diagnostics", "MyKey");

获取名为“diagnostics”的哈希表中键为“MyKey”的值。

IDatabase.HashSet("diagnostics", "MyKey", "My Value");

将值“My Value”存储在名为“diagnostics”的哈希表中键为“MyKey”的位置。

我喜欢这种方法。虽然在检索所有哈希字段和值时遇到了问题,但会另外发布一个问题。 - souser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接