销售电话: 1-800-867-1380

Azure 托管缓存服务的并发模型

更新时间: 2010年7月

note备注
有关为你的应用程序选择合适的 Azure 缓存产品/服务的指导,请参阅 Azure 缓存常见问题解答

缓存体系结构允许任何缓存客户端访问任何缓存的数据(如果这些客户端具有适当的网络访问权限和配置设置)。这对并发是一个挑战。

为了帮助你的应用程序处理并发问题,乐观并发模型和悲观并发模型均受系统支持。

在乐观并发模型中,对缓存对象的更新不需要锁定。但当缓存客户端从缓存获得对象时,它还获得并存储该对象的当前版本。当需要进行更新时,缓存客户端会将对象新值与已存储的版本对象一起发送。仅当发送的版本与缓存中对象的当前版本匹配时,系统才会更新对象。对象的每次更新都会更改其版本号,这可以防止更新覆盖其他人的更改。

本主题中的示例介绍乐观并发模式如何维护数据的一致性。

在此示例中,两个缓存客户端(cacheClientAcacheClientB)将尝试更新具有相同键 RadioInventory 的同一缓存对象。

时间零点:两个客户端都检索同一个对象

在时间零点 (T0),两个客户端都实例化 DataCacheItem 类,以捕获其要更新的缓存对象,以及与已该缓存对象关联的其他信息(例如,版本和标记信息)。此内容将在以下代码示例中说明。

//cacheClientA pulls the FM radio inventory from cache
string strACSKey = "[Authentication token]";
DataCacheSecurity clientAFactorySecurity = new DataCacheSecurity(strAcsKey);

DataCacheFactoryConfiguration clientAFactoryConfiguration = new DataCacheFactoryConfiguration();
// Set up desired parameters for Cache Factory
clientAFactoryConfiguration.SecurityProperties = clientAFactorySecurityDataCacheFactory;

clientACacheFactory = new DataCacheFactory(clientAFactoryConfiguration);
DataCache cacheClientA = clientACacheFactory.GetCache("catalog");
DataCacheItem radioInventoryA = 
    cacheClientA.GetCacheItem("RadioInventory");

//cacheClientB pulls the same FM radio inventory from cache
// clientBFactorySecurity and clientBFactoryConfiguration omitted for space
DataCacheFactory clientBCacheFactory = new DataCacheFactory();
DataCache cacheClientB = clientBCacheFactory.GetCache("catalog");
DataCacheItem radioInventoryB= 
    cacheClientB.GetCacheItem("RadioInventory");

note备注
虽然此示例通过使用 GetCacheItem 方法获得版本信息来检索 DataCacheItem 对象,但它还可以使用 Get 方法获得与检索到的缓存项目关联的 DataCacheItemVersion 对象。

时间 1:首次更新成功

在时间 1(T1),cacheClientA 更新具有新值的缓存对象 RadioInventory。当 cacheClientA 执行 Put 方法时,与 RadioInventory 缓存项目相关联的版本会递增。此时,cacheClientB 具有过期缓存项目。此内容将在以下示例中说明。

//at time T1, cacheClientA updates the FM radio inventory
int newRadioInventoryA = 155;

cacheClientA.Put("RadioInventory", newRadioInventoryA, 
    radioInventoryA.Version);

时间 2:第二次更新失败

在时间 2(T2),cacheClientB 使用当前过期的版本号尝试更新 RadioInventory 缓存对象。为防止 cacheClientA 的更改被覆盖,cacheClientBPut 方法调用失败。缓存客户端引发 DataCacheException 对象,该对象的 ErrorCode 属性设置为 CacheItemVersionMismatch。此内容将在以下代码示例中说明。

//later, at time T2, cacheClientB tries to 
//update the FM radio inventory, receives DataCacheException with
//an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
int newRadioInventoryB = 130;

cacheClientB.Put("RadioInventory", newRadioInventoryB,
    radioInventoryB.Version);

在悲观并发模型中,客户端明确锁定要执行操作的对象。锁定被释放之前,请求锁定的其他操作将被拒绝(系统不会阻止请求)。当锁定对象时,锁定句柄将作为输出参数返回。需要锁定句柄来解锁对象。如果客户端应用程序在释放锁定对象前结束,则提供超时以释放锁定。锁定的对象永不过期,但如果超过过期时间,则锁定的对象可能在被解除锁定后立即过期。

有关用于悲观并发模型的方法的详细信息,请参阅并发方法

note备注
不支持事务跨越操作。

note备注
使用缓存的应用程序负责确定锁定的顺序并检测死锁(如果有)。

Warning警告
仍然可以使用 Put 方法将缓存中锁定的对象替换为任何缓存客户端。启用了缓存的应用程序负责对使用悲观并发模型的项目一致使用 PutAndUnlock

另请参阅

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft