我目前正在一个支持多语言的网站 (ASP MVC) 工作,其中每个 Web 内容都存储在数据库中,例如我有英文版、西类牙文版等。但我担心它运行时的性能投入生产,因为每次用户点击我的页面时,至少有 20 次数据库调用来获取内容。
我能做些什么来提高效率吗?
我不能做的是:
在每次页面加载时将所有数据库调用合并为 1 个调用(这需要 太多的努力)。
为每种语言制作一个单独的 html 页面(我需要最终用户能够在不更改代码的情况下添加新语言,因此 数据库设计)。
我正在考虑在用户浏览器中缓存所有内容,并在他们每次访问我的页面时进行比较,如果不匹配,它只会调用数据库,但我不确定如何处理。
如有任何帮助,我们将不胜感激,对于糟糕的英语,我们深表歉意。
最佳答案
在这种情况下,我建议使用静态字典,正如@Vsevolod-Goloviznin 在评论中所建议的那样。 让我详细说明我的方法
您的数据库中可能有一个本地化资源,该资源也用一些命名键和语言键标识:
var homePageTitle = Database.GetResource("homeTitle", "es");
你应该建立一个静态字典,用作缓存,将数据库中的所有资源都放在内存中,以便轻松方便地访问:
public static MultiLanguageManager { private static Dictionary<string, Dictionary<string, string>> ContentCache; ... public static GetResource(string key, string language) { return (ContentCache[language])[key]; } }
然后在你的前端你会有这样的东西:
... <title>@MultiLanguageManager.GetResource("aboutTitle", "en")</title> ...
每当用户更改数据库中的本地化内容时,您应该手动重建 ContentCache 字典:
// update localized content ... MultiLanguageManager.RebuildContentCache(); ...
通过使用这种方法,您可以将数据库调用次数降至最低(仅检索逻辑单元,而非静态资源),并控制本地化数据的一致性。 一个可能的缺点可能是您将构建的静态字典的大小,但随着当今资源的丰富,这在 99% 的情况下应该不是问题。
关于c# - 多语言网站性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27685194/