【问题标题】:Synchronizing local cache with external application将本地缓存与外部应用程序同步
【发布时间】:2011-10-26 17:52:13
【问题描述】:

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

  1. 创建和更新数据的“管理”应用程序
  2. 显示数据的“公共”应用程序。

“public”上显示的信息不经常变化,所以想缓存一下。

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

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

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

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

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

我在想什么(可能有点老套,但很简单):

  1. 在公共站点上执行清除内存缓存的控制器操作。我不担心清除特定的缓存项目,数据变化不足以让我担心。当“管理员”应用程序进行缓存时,我们会向公共站点上的清除缓存操作发出 httpwebrequest。
  2. 由于数据库是两个应用程序之间唯一的共享资源,因此只需添加一个带有上次更新日期时间的表即可。公共站点将对每个请求进行查询,并将数据库上次更新日期时间与我们将保存在内存中的日期时间进行比较。如果不匹配,则我们清除缓存。

上述选项还有其他建议或问题吗?这里的关键是简单和高性能。

【问题讨论】:

  • 一般我们用redis来做这种东西,它也为我们提供了消息总线。在一个地方,我使用了数据库轮询。

标签: asp.net .net caching azure


【解决方案1】:

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

2.,您有一个存储上次更新时间的表,该表适用于多个实例,但会产生每个请求的 SQL 数据库查询成本 - 对于负载重的站点,这可能是一个问题。

可能最快和最简单的方法是使用选项 2,但将上次更新时间存储在表存储中而不是 SQL 数据库中。读取表存储的速度非常快——实际上它是一个简单的 HTTP GET。

【讨论】:

  • 是的,我们将只有一个实例开始 - 我意识到当我们添加更多时选项 1 将不起作用。 +1 建议 Azure 表存储,我没有想到这一点。
  • 除此之外,还要考虑陈旧数据在哪里是好的,哪里需要最新数据。然后可以在不需要保持数据最新的数据集上使用缓存失效和重新加载。
【解决方案2】:

只要您只有一个主站点的实例,就可以调用一个公共控制器来告诉站点清除其缓存。添加第二个实例后,由于调用会通过负载均衡器,因此您的一个调用只会转到一个实例。

如果您不关心更新从管理站点到主站点的速度,最佳性能和最简单(但不是最便宜)的解决方案是使用Azure AppFabric Cache,然后使用configure it to use a a local (in memory) cache短暂的超时(比如 10 分钟)。

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

  1. 在本地缓存中查找项目
  2. 它不存在,因此在分布式缓存中查找该项目
  3. 它也不存在,所以从持久存储中加载项目
  4. 将项目添加到缓存中具有较长的生存时间(我认为默认为 48 小时)
  5. 退货

第 1 步和第 2 步由库为您处理,其他部分您需要编写。接下来 X 分钟内的任何后续调用都将从内存缓存中返回该项目。 X 分钟后,它会从本地缓存中掉出。下一次调用将其从分布式缓存加载回本地缓存,您可以继续。

您的管理应用程序需要做的就是更新数据库,然后从分布式缓存中删除该项目。下次该项目从客户端的本地缓存中掉出时,它会简单地从数据库中重新加载数据。

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

【讨论】:

  • 感谢您的建议。老实说,如果我沿着分布式缓存路线走下去,我可能会使用 Memcached,因为我不喜欢在不需要时必须支付更多费用的想法。关于何时检查变量的好建议,我可以通过声明(本地)缓存项的回调来很好地做到这一点。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 2011-09-16
    • 2018-06-07
    相关资源
    最近更新 更多