Azure缓存-如何确定一个密钥是否在缓存中?

5

在使用Azure Caching时,是否有一种方法可以确定缓存中是否存在具有特定键的对象,而不实际返回对象本身?

我目前正在执行类似以下代码:

    public bool IsKeyInCache(string cacheKey)
    {
        DataCacheItem item = null;
        CacheRetryPolicy.ExecuteAction(() =>
        {
            item = cache.GetCacheItem(cacheKey);
        });

        return item != null;
    }

但是,因为缓存中的对象非常大且反序列化的成本很高,性能非常差。

我查阅了MSDN文档,没有看到任何替代方案,但也许我错过了什么。

我目前最好的想法是在与我的大对象同时将一个小的“标记”对象添加到缓存中,并在反序列化成本较低的位置检查“标记”对象是否存在。但这不是一个强大的解决方案,因为我的大对象有可能被从缓存中清除,而“标记”对象仍然存在。


3
我会尝试简要解释为什么某个缓存可能无法实现......原因很简单,就是由于竞争条件。在检查键是否存在和读取键的值之间,该项可能已经从缓存中删除了。 - ta.speot.is
问:为什么不直接请求值?只是好奇-检查键是否在缓存中的用例是什么? - paulsm4
1个回答

0

DataCache.Get()会返回缓存中的项。我只想知道指定的键是否存在于缓存中,是或否的答案即可。 - Mr. T
如果数据不在缓存中,就会返回 NULL。DataCache.Get(key) 是您最好的选择,即使是布尔型的真/假。以我个人的看法... - paulsm4
2
这是我的“最佳选择”,因为显然这是我唯一的选择。假设我已经缓存了一个非常大的对象。当我只想知道“这个键是否存在”时,为什么要付出将其从缓存(可能在集群的另一个成员上)传输并跨越网络到我的角色实例的代价呢? - Mr. T

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