我正在寻找一些关于访问驻留在公司内部Web服务中的缓存数据的策略。实际上,在刷新缓存时阻止访问缓存的数据。
我们在Web场上运行.Net 3.5 C#Web服务,该服务维护着六个左右数据集的缓存。此数据是配置关联项,由“真实”业务逻辑域引用,该域也在此Web服务中运行,并且为任何客户端使用返回。可能总共在十几张桌子上讲了几千条记录。
我们使用MS Enterprise Library 4.1实现了一个缓存机制。没有太大的理由在ASP.Net缓存上使用它,除了我们已经使用Enterprise Library进行其他一些事情,我们喜欢缓存到期处理。这是我们第一次在这里实现了一些缓存,所以也许我错过了一些基本的东西......
此配置数据不会经常更改 - 可能一天几次。当此配置数据确实发生更改时,我们会使用新数据更新更新请求所在的特定服务器上的缓存(更新过程将通过Web服务)。对于Web场中的其他服务器(当前总共3台服务器),我们将缓存过期设置为15分钟,在该数据库中,从服务器场中所有服务器命中的单个数据库重新加载数据。出于我们的特殊目的,服务器之间的这种延迟是可以接受的(尽管我认为不理想)。
在此刷新过程中,可能会出现需要访问数据的其他请求。由于请求可能在到期/刷新过程中发生,因此缓存中当前没有数据,这显然会导致问题。
有什么策略可以解决这个问题?如果这是在单一域类型的WinForm类型的应用程序中,我们可能会破解某些内容,这会阻止在刷新过程中使用类变量/循环,线程/互斥或其他类似单一结构的访问。但我对在Web场上运行类似的东西很谨慎。我可以做?是一种分布式服务器缓存机制,而不是每个服务器都有自己的缓存?如果可以的话,我想避免这样做,并提出一些编码来解决这个问题。我错过了什么吗?
感谢您的任何意见。
更新:我将在过期操作周围使用Lock关键字功能,随后刷新数据,但我担心在Web服务器上执行此操作。我认为虽然在我看来仍然有可能(尽管是较小的一个)我们可以在它过期的时间和输入锁定的时间之间从空缓存中获取数据(过期行动)发生在我认为的另一个线程上)。所以我们所做的是如果在常规数据请求期间缓存中没有数据,我们假设它正在刷新并且只是从源中获取数据。我认为这将有效,因为我们可以假设应该始终填充缓存,因为当首次创建Web服务请求时创建保存缓存的单例类时,将发生初始缓存填充过程。因此,如果缓存为空,则表示它当前正在填充,这通常只需要几秒钟,因此在此期间来自缓存的任何数据请求将是唯一没有达到缓存的数据。
如果有经验的人想对此有所了解,我们将不胜感激。
答案 0 :(得分:0)
听起来我已经在提供过时的数据了。因此,如果允许这样做,为什么不在发现旧缓存时填充缓存的新副本,并且只有在完全填充后才切换到使用缓存。
答案 1 :(得分:0)
这实际上取决于更新逻辑。你决定更新缓存在哪里?您可以将更新传播到服务器场中的所有服务器吗?然后你应该在更新时锁定。如果您的更新过程是由用户操作启动的,您是否可以让其他服务器知道它们应该使其缓存过期?