0

作为 ASP.NET 网站的一部分,我维护本地化/文本翻译是使用存储在 SQL 数据库中的文本而不是使用 ResX 文件来处理的;为什么以这种方式完成取决于遗留问题,但这就是我们所做的,但它确实使我们能够相当轻松地进行更改。文本存储在这样的表中:

CREATE TABLE [Text](
    [TextID] [int] NOT NULL,
    [LanguageID] [int] NOT NULL,
    [Text] [nvarchar](max) NULL
)
CONSTRAINT [PK_Text] PRIMARY KEY CLUSTERED 
(
    [TextID] ASC,
    [LanguageID] ASC
)

并且网站中的代码隐藏将引用所选语言的文本 ID,以将正确的文本分配给 HTML 元素,例如标签等。

现在因为我们有这么多可用的文本并且在每个页面请求上访问数据库只是为了翻译一个页面非常慢,我们实际上所做的是在应用程序启动时使用HttpApplicationState将该表中的所有文本缓存到服务器内存中。

我们现在遇到的问题是,因为我们有几个 Web 服务器正在负载平衡,所以更新静态缓存变得很困难;我们现在必须等待应用程序池回收,然后才能看到所做的任何更改。同样正如上面的链接所暗示的:

...在应用程序状态下存储大块数据可能会填满服务器内存,导致服务器将内存分页到磁盘。

所以我想知道我可以使用什么其他解决方案?我需要能够缓存所有这些文本以获得更高的性能,但还需要能够比每天一次更频繁地更新它,并且能够跨多个服务器管理此缓存。

4

1 回答 1

1

您正在寻找的术语是“分布式缓存”。如果你用谷歌搜索,你会找到一些对你有帮助的选项。分布式缓存的一些优点:

  1. 数据存储在 RAM 中,而不是磁盘中。
  2. 数据分布在许多节点上,并允许您水平扩展(只需添加一个节点)。
  3. 缓存将在他们自己的专用机器上运行。这将减轻 Web 服务器上的负载。

需要研究的一些技术:

  1. AppFabric(适用于 .NET):http ://en.wikipedia.org/wiki/AppFabric#AppFabric_Caching
  2. 内存缓存: http: //memcached.org/
  3. 沙发底座:http : //www.couchbase.com/

我之前在 .NET 中使用过 AppFabric,它对我们公司非常有效。很容易添加节点并根据需要增长。

于 2013-04-16T17:28:30.000 回答