将本地缓存与外部应用程序同步

时间:2011-10-26 17:52:13

标签: asp.net .net caching azure

我有两个独立的网络应用程序:

  1. 创建和更新数据的“admin”应用程序
  2. 显示数据的“公共”应用程序。
  3. “public”上显示的信息不经常更改,因此我想缓存它。

    我正在寻找的是在管理站点进行更改时更新公共站点上的缓存的“最简单的事情”。

    为了增加一些复杂性,应用程序在Windows Azure上运行。这排除了文件和sql缓存依赖关系(至少是内置的)。

    我在一个Web角色实例上运行这两个应用程序。

    我考虑过将Memcached用于此目的。但是因为我并不是真正使用分布式缓存,并且性能不如使用内存缓存(System.Runtime.Caching),所以我想尝试避免这种情况。

    我也考虑过使用NServiceBus(或Azure等价物),但是再次发送清除缓存的通知似乎有点过分了。

    我在想什么(也许有点hacky,但很简单):

    1. 在公共站点上执行控制器操作以清除内存缓存。我并不打算清除特定的缓存项目,数据不会改变,我担心这一点。当“admin”应用程序创建缓存时,我们在公共站点上对clear cache action进行httpwebrequest。
    2. 由于数据库是两个应用程序之间唯一的共享资源,因此只需添加一个包含上次更新日期时间的表。公共站点将对每个请求进行查询,并将数据库的上次更新日期时间与我们将在内存中保存的日期时间进行比较。如果它不匹配,那么我们清除缓存。
    3. 上述选项的任何其他建议或问题?这里的关键是简单而高效。

3 个答案:

答案 0 :(得分:1)

1.如果你有一个控制器动作来清除缓存,那么如果你有多个实例,它将不起作用;否则,如果你知道你只有一个实例,它应该可以正常工作。

2.,如果你有一个存储上次更新时间的表,那么对于多个实例可以正常工作,但每次请求会产生SQL数据库查询的成本 - 对于负载很重的站点,这可能是一个问题。 / p>

可能最快最简单的方法是使用选项2,但将最后更新时间存储在表存储而不是SQL数据库中。对表存储的读取速度非常 - 在封面下它是一个简单的HTTP GET。

答案 1 :(得分:1)

只要您只有一个主站点实例,拥有一个可以调用以告知站点清除其缓存的公共控制器将起作用。一旦您添加第二个实例,当呼叫通过负载均衡器时,您的一个呼叫将只转到一个实例。

如果您不关心更新从管理站点到主站点的时间,那么最佳性能和最简单(但不是最便宜)的解决方案是使用Azure AppFabric Cache然后{{短暂的超时(比如10分钟)。

您的客户首次尝试访问某个项目时会发生这种情况

  1. 在本地缓存中查找项目
  2. 它不存在,所以在分布式缓存中查找项目
  3. 它不存在从持久存储加载项目
  4. 将该项目添加到缓存中,需要很长时间才能生效(我认为默认为48小时)
  5. 退回商品
  6. 图书馆为您完成了步骤1和2,您需要编写的其他位。在接下来的X分钟内进行的任何后续调用都将从内存缓存中返回该项。在X分钟后,它落在本地缓存之外。下一次调用将它从分布式缓存加载回本地缓存,您可以继续。

    您的所有管理应用程序需要做的是更新数据库,然后从分布式缓存中删除该项目。下次该项目脱离客户端上的本地缓存时,它将只是从数据库重新加载数据。

    如果您喜欢这个想法,但又不想花费使用缓存服务的费用,那么您可以做一些与您的数据库想法非常相似的事情。将缓存的数据保存在静态变量中,每隔x分钟检查一次更新,而不是每次请求。

答案 2 :(得分:0)

最后,我使用Azure Blob作为缓存依赖项。我创建了一个文件更改监视器来轮询文件的更改(http://ben.onfabrik.com/posts/monitoring-files-in-azure-blob-storage处的完整详细信息)。

当在管理应用程序中进行更改时,我更新了blob。当文件更改监视器检测到更改时,我们清除本地缓存。