我有两个独立的网络应用程序:
“public”上显示的信息不经常更改,因此我想缓存它。
我正在寻找的是在管理站点进行更改时更新公共站点上的缓存的“最简单的事情”。
为了增加一些复杂性,应用程序在Windows Azure上运行。这排除了文件和sql缓存依赖关系(至少是内置的)。
我在一个Web角色实例上运行这两个应用程序。
我考虑过将Memcached用于此目的。但是因为我并不是真正使用分布式缓存,并且性能不如使用内存缓存(System.Runtime.Caching),所以我想尝试避免这种情况。
我也考虑过使用NServiceBus(或Azure等价物),但是再次发送清除缓存的通知似乎有点过分了。
我在想什么(也许有点hacky,但很简单):
上述选项的任何其他建议或问题?这里的关键是简单而高效。
答案 0 :(得分:1)
1.如果你有一个控制器动作来清除缓存,那么如果你有多个实例,它将不起作用;否则,如果你知道你只有一个实例,它应该可以正常工作。
2.,如果你有一个存储上次更新时间的表,那么对于多个实例可以正常工作,但每次请求会产生SQL数据库查询的成本 - 对于负载很重的站点,这可能是一个问题。 / p>
可能最快最简单的方法是使用选项2,但将最后更新时间存储在表存储而不是SQL数据库中。对表存储的读取速度非常 - 在封面下它是一个简单的HTTP GET。
答案 1 :(得分:1)
只要您只有一个主站点实例,拥有一个可以调用以告知站点清除其缓存的公共控制器将起作用。一旦您添加第二个实例,当呼叫通过负载均衡器时,您的一个呼叫将只转到一个实例。
如果您不关心更新从管理站点到主站点的时间,那么最佳性能和最简单(但不是最便宜)的解决方案是使用Azure AppFabric Cache然后{{短暂的超时(比如10分钟)。
您的客户首次尝试访问某个项目时会发生这种情况
图书馆为您完成了步骤1和2,您需要编写的其他位。在接下来的X分钟内进行的任何后续调用都将从内存缓存中返回该项。在X分钟后,它落在本地缓存之外。下一次调用将它从分布式缓存加载回本地缓存,您可以继续。
您的所有管理应用程序需要做的是更新数据库,然后从分布式缓存中删除该项目。下次该项目脱离客户端上的本地缓存时,它将只是从数据库重新加载数据。
如果您喜欢这个想法,但又不想花费使用缓存服务的费用,那么您可以做一些与您的数据库想法非常相似的事情。将缓存的数据保存在静态变量中,每隔x分钟检查一次更新,而不是每次请求。
答案 2 :(得分:0)
最后,我使用Azure Blob作为缓存依赖项。我创建了一个文件更改监视器来轮询文件的更改(http://ben.onfabrik.com/posts/monitoring-files-in-azure-blob-storage处的完整详细信息)。
当在管理应用程序中进行更改时,我更新了blob。当文件更改监视器检测到更改时,我们清除本地缓存。