Caching Azure本地缓存与分布式缓存

Caching Azure本地缓存与分布式缓存,caching,azure,distributed-caching,Caching,Azure,Distributed Caching,过去几天我一直在使用Azure缓存。好的做法是使用本地缓存功能来防止到分布式缓存的往返 如文件所示;调用dataCache.Get(…)时,应用程序首先检查本地缓存中的版本是否可用,如果不可用,则从分布式缓存中检索对象。 问题是本地版本可能比对象的分布式版本旧。要解决此问题,可以使用“dataCache.GetIfNewer(…)”方法检查本地对象的版本是否与分布式版本不同,如果不同,则返回新对象 到目前为止,一切都很好…现在我的问题;我已经创建了两个独立的应用程序(appa和appb)来测试A

过去几天我一直在使用Azure缓存。好的做法是使用本地缓存功能来防止到分布式缓存的往返

如文件所示;调用dataCache.Get(…)时,应用程序首先检查本地缓存中的版本是否可用,如果不可用,则从分布式缓存中检索对象。 问题是本地版本可能比对象的分布式版本旧。要解决此问题,可以使用“dataCache.GetIfNewer(…)”方法检查本地对象的版本是否与分布式版本不同,如果不同,则返回新对象

到目前为止,一切都很好…现在我的问题;我已经创建了两个独立的应用程序(appa和appb)来测试Azure缓存机制。两个应用程序都在两个不同的(物理)位置上运行,因此它们都有自己的本地缓存,但它们都使用相同的分布式缓存

在使本地缓存无效的过程中是否确实发生了一些变化?我测试了以下场景,发现本地缓存会自动更新:

  • 应用程序A使用“CacheTest”键将值“123”存储在分布式缓存中
  • 应用程序B使用dataCache.Get(…)方法检索密钥“CacheTest”的对象,该密钥在本地缓存中找不到,因此从分布式缓存中检索该对象,然后返回值为“123”的对象
  • 应用程序A将键为“CacheTest”的对象更改为值“456”
  • 应用程序B使用datacache.Get(…)方法(再次)检索对象。因为对象应该在本地缓存中,所以我希望值为“123”,但它返回新值“456”
这有多奇怪?Azure缓存最近有什么变化吗?是的……我确信我已经打开了本地缓存,是的,我已经将本地缓存的超时设置为3600秒(1小时)

有人能确认Azure缓存已更改吗

为尼克编辑: 那么你的意思是我在荷兰微软网站上找到的下几行代码都是胡说八道?当本地缓存自动更新时,无需调用“GetIfNewer”方法:

//
///确保返回缓存对象的最新版本
///从本地缓存或分布式缓存。
/// 
公共TCachedObjectType GetNew(字符串键):
其中TCachedObjectType:class
{
DataCacheItemVersion;
//从本地缓存获取缓存对象(如果存在)。
//否则从分布式缓存中获取缓存对象并
//将其添加到本地缓存。
object cachedObject=cache.Get(key,out版本);
//从分布式缓存中获取缓存对象(如果该对象较新)
//比给定的版本。
//如果更新,则将其添加到本地缓存。
对象可能NewRCachedObject=
GetIfNewer(key,ref版本);
if(可能为ewercachedObject!=null)
{
//分布式缓存中的缓存对象较新
//而不是本地缓存中的缓存对象。
cachedObject=可能的newercachedbject;
}
将cachedObject返回为tcachedbjecttype;
}

如果所述行为与appfabric velocity相同,则所述行为与预期相同。启用本地缓存意味着当给定节点从分布式缓存请求缓存项时,它会询问分布式缓存当前版本是什么。 如果本地缓存的版本与分布式版本匹配,它将从本地缓存返回数据。如果没有,它将从分布式缓存中检索最新的值,在本地缓存它,然后返回它。
其思想是,如果任何节点更新了密钥,那么即使appfabric已经在本地缓存了所有节点,也将始终确保所有节点都获得最新版本。分布式缓存跟踪最新版本及其数据的存储位置。

谢谢Nick,所以我在问题中添加的行都是废话?我不确定,在我的项目中,我们使用的是appfabric velocity(不是azure)。我们启用了本地缓存。我们只使用“get”,而不使用“getifnewer”。get调用总是转到appfabric分布式缓存集群,但是由于启用了本地缓存,如果本地缓存已经具有当前版本,则不必从集群序列化回完整缓存键值对象。例如,我不会向缓存集群询问特定的版本,我只会询问是否需要密钥,appfabric客户端将根据需要从本地缓存中检索/存储。我只是查看了荷兰网站。我认为我的答案是正确的,他们试图归档的内容略有不同。通过传递版本并调用GetIfNewer,如果版本仍然是最新的,则通过引用传递的对象将被保留(以及对其所做的任何本地更改),而如果调用Get,则始终会返回一个新对象。这取决于你需要什么。没错……但是在文章中,他们在Get之后直接调用GetIfNewer。因此,在这些调用之间的几毫秒内,对象发生变化的可能性非常非常小。无论如何;谢谢你帮助我!
/// 
/// Ensures that the newest version of a cached object is returned 
/// from either the local cache or the distrbuted cache.
/// 
public TCachedObjectType GetNewest<TCachedObjectType>(string key) : 
   where TCachedObjectType : class
{
DataCacheItemVersion version;

// Gets cached object from local cache if it exists.
// Otherwise gets cached object from distributed cache and 
// adds it to local cache.
object cachedObject = cache.Get(key, out version); 

// Gets cached object from distributed cached if it is newer
// than given version. 
// If newer it adds it to local cache.
object possiblyNewerCachedObject = 
     cache.GetIfNewer(key, ref version);

if (possiblyNewerCachedObject != null)
{
    // Cached object from distributed cache is newer 
    // than cached object from local cache.
    cachedObject = possiblyNewerCachedObject;
}

return cachedObject as TCachedObjectType;
}