我是天蓝色缓存的新手并面临一个问题。
我先简单介绍一下场景。我们正在SQL Azure
为我们的应用程序使用数据库。为了避免延迟问题和限制问题,我们使用 Azure 缓存(Web 角色上的共存缓存)。通过使用 Azure 缓存,我们只从数据库中获取数据一次并将其保存在缓存中以供进一步使用。
由于我们使用的是缓存数据,因此这里的挑战是在执行任何 DML 操作的任何时间点始终保持 SQL Azure DB 和 Azure 缓存之间的数据同步。我们通过首先更新数据库来做到这一点,如果更新成功则缓存数据无效。这种方法适用于正常情况。但是,随着并发用户工作和执行更新,似乎存在问题。我们在更新缓存中的数据时使用悲观并发模型。在这里,我们使用瞬态重试策略来确保重试尝试(假设 5 次,固定间隔为 1 秒)。
示例代码如下所示:
Microsoft.Practices.TransientFaultHandling.RetryPolicy cacheRetryPolicy =
GetAzureCacheRetryPolicy();
cacheRetryPolicy.Retrying += TransientRetryManager.OnRetrying;
DataCacheLockHandle handle = null;
cacheRetryPolicy.ExecuteAction(() =>
{
try
{
object obj = cache.GetAndLock(key, TimeSpan.FromSeconds(1), out handle);
cache.PutAndUnlock(key, value, handle, expirationTime.Value, tags);
}
catch (DataCacheException ex)
{
if (ex.ErrorCode == DataCacheErrorCode.KeyDoesNotExist)
{
cache.Put(key, value, expirationTime.Value, tags);
}
else
{
//This means wait till the cache is released.
//Throwing from here will allow to retry with Transient
//handling retry policy.
throw ex;
}
}
}
在这里,如果等待次数(比如说 6 次)超过重试次数(在我们的例子中是 5 次)。到第 6 次轮到它时,重试尝试已经结束,因此具有最新更新的第 6 次等待将无法在缓存中更新它。
有一种方法可以通过排队所有等待来克服这个问题,以防errorcode
在objectlocked
获取缓存键上的锁定时。
谁能建议处理这种情况的最佳方法?