我有一项服务,每四小时更新一次包含8000个对象的AppFabric缓存。它读取一个表,从每个记录创建一个对象并将其存储在缓存中。
当缓存正在更新时,消费者仍然可以从缓存中请求对象。关于这一点的信息不多,所以我想知道以下代码是否是在appfabric中锁定和存储缓存对象的正确方法,而其他线程可以查询缓存:
// caching part
private static void CacheDealers(Dictionary<Key<string>, Dealer> dealers)
{
DataCache cache = Cache.Instance.DealerCache;
foreach (Key<string> key in dealers.Keys) {
CacheObject(cache, key.ToString(), dealers[key], mDealerRegionName);
}
}
private static void CacheObject(DataCache cache, string key, object obj, string region)
{
DataCacheLockHandle lockHandle;
if (cache.GetAndLock(key, TimeSpan.FromSeconds(10), out lockHandle) == null)
{
cache.Put(key, obj, TimeSpan.MaxValue, region);
}
else
{
cache.PutAndUnlock(key, obj, lockHandle, TimeSpan.MaxValue, region);
}
}
// retrieve part
public Dealer GetDealer(string lab, string number) {
Dealer dealer = (Dealer)Cache.Instance.DealerCache.Get(new Key<string>(lab, number).ToString(), mDealerRegionName);
return dealer;
}
答案 0 :(得分:1)
仍然可以从缓存中读取锁定的项目(虽然锁定它将返回原始对象,而不是更新的对象),因此在更新缓存时,GetDealer
方法应该继续工作。来自MSDN:
常规获取方法调用未被阻止,并始终访问最新 缓存对象的版本