使用StackExchange.Redis客户端在redis缓存中更新Dictionary对象

时间:2015-05-12 01:38:06

标签: c# caching redis stackexchange.redis azure-redis-cache

我正在使用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(&#34; diagnostics&#34;,()=&gt; new Dictionary());

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

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

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

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

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

但它对我来说似乎并不合适。我相信必须有更好的方法来做到这一点。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

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

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

IDatabase.HashGet(&#34; diagnostics&#34;,&#34; MyKey&#34;);

IDatabase.HashSet(&#34; diagnostics&#34;,&#34; MyKey&#34;,&#34; My Value&#34;);