我们一直在将我们的服务和 MVC4 网站转移到云端,总的来说这个过程很顺利。除了缓存之外,由于我们已经迁移到 Azure,因此使用 azure 提供的某种缓存也是明智之举。我们选择共同定位/专用缓存角色,其优点是缓存可用于所有实例。
设置缓存工作正常,我有一个命名缓存客户端,我只在需要时对其进行初始化。它设置在控制器的继承层中。一旦调用其中一个函数,它就会检查与数据缓存的连接是否仍然存在或已创建。这一切似乎都很好,但我正在构建一个模块来检索价格。并且多个 ajax 插入(使用 javascript 插入页面的视图)使用这些函数,其中一些被多个 ajax 视图同时调用。其中一些视图然后返回 404 或 500 错误,除了非工作缓存或类似情况外,我无法解释这些视图的来源。
有人可以帮助我很好地实现命名缓存(共同定位或专用),因为我所能找到的只是说明 DataCacheFactory 初始化的许多示例,而不是数据插入和检索的示例。
下面是我现在拥有的代码,我尝试了更多使用锁定等的方法,但到目前为止这个方法效果最好。
private static object magicStick = new object();
private static DataCacheFactory dcf = null;
private static DataCache priceCache = null;
protected void CreateCacheFactory()
{
dcf = new DataCacheFactory();
}
protected void CreatePricesCache()
{
if (dcf == null)
{
CreateCacheFactory();
}
priceCache = dcf.GetCache("Prices");
}
protected PriceData GetPrices(int productID)
{
if (priceCache == null)
{
CreatePricesCache();
}
string cacheKey = "something";
lock (magicStick)
{
PriceData datas = priceCache.Get(cacheKey) as PriceData;
if (datas == null)
{
lock (magicStick)
{
Services svc = new Services();
PriceData pData = svc.PriceService.GetPrices(productID);
if (pData != null && pData.Offers != null && pData.Offers.Count() > 0)
{
datas = pData;
datas.Offers = datas.Offers.OrderBy(pr => (pr.BasePrice + pr.ShippingCosts)).ToArray();
priceCache.Add(cacheKey, datas, new TimeSpan(0, cachingTimePricesKK, 0));
}
}
}
return datas;
}
}
一旦我进入一个有价目表的页面,并且使用相同的参数多次调用上述函数,它就有 5-10% 的机会返回错误而不是返回结果。任何人都可以帮助我,我现在完全坚持了一个星期,它在里面把我吃掉了。