0

我有一个在 ASP.Net 中构建的具有自动建议功能的搜索模块。搜索条件是培训名称,并且数据库中有一个存储培训的表。表中的训练规模将高达 30,000 次,因此我在选择方法时必须非常小心,同时牢记性能。

可能有大约 3000 个用户同时登录系统。当用户开始输入培训名称时,系统应自动建议。

我想到的方法如下

  1. 缓存对象 - 用户键入 3 个(例如 saf)字符后会出现数据库命中,系统将在活动表中搜索所有以 saf 开头的训练并缓存它们。其他请求将通过此缓存。但是这种方法的问题是,如果有 3000 个并发用户在使用系统,并且如果他们都搜索 3 个不同字母的不同组合,那么缓存就会被破坏。

  2. 客户端缓存 - 对此没有多想。我在这里看到的唯一缺点是我们可能必须定期清除临时 Internet 文件夹。

  3. 使用 Session - 我想完全排除这种情况,因为我认为它会影响性能。

您能否建议我可以在这里采取的最佳或任何其他不同的方法。我正在寻找您对此的所有信息/想法。

太感谢了

迪帕。

4

4 回答 4

1

我最喜欢的 jQuery 插件(如果您打算使用 jQuery)是Flexbox

它有一个非常令人印象深刻的功能列表。

于 2009-02-06T11:16:51.973 回答
0

您的帖子确实包含两个问题:

  1. 如何在我的网页上获得自动完成功能?
  2. 由于大量查询同时访问我的数据库,我担心性能。

我的回答...

1:我们发现 ASP.NET AJAX AutoComplete Extender在所有现代浏览器上都运行良好,提供了流畅的用户体验并且很容易实现。

在您的 Web 应用程序中,您需要创建一个具有特定签名的方法的 Web 服务(在上面链接的文档中介绍)。

2:您是否证明您在项目的这一部分确实存在性能瓶颈?我建议设置一个测试工具并使用大量自动完成查询来访问您的数据库,以查看它可以花费多少。提防过早的优化

于 2009-02-06T17:34:05.347 回答
0

您可以使用内置缓存功能的jQuery Auto Complete 插件。

$(document).ready(function()
{
        $(".landingpage").autocomplete('/AutoSuggestHandler.ashx',
        {
            minChars: 1,
            matchSubset: 1,
            autoFill: false,
            delay: 10,
            scroll: false
        }).result(OnResultSelected);
}

此外,您可以在通用处理程序上指定输出缓存,以适应跨用户缓存的需要。

于 2009-02-06T11:01:40.880 回答
0

我认为你的第一种方法会奏效。

确保字段上有索引 - 您可能不需要索引整个字段。这应该会给数据库一个不错的提升。您可能需要根据搜索的工作方式查看全文索引,甚至使用 lucene 之类的外部库,因为索引是性能问题。

缓存对象,甚至是查询生成的 xml/json 以提高性能。

您还应该设置 http 标头,以便浏览器也缓存 xml/json。

于 2009-02-06T11:03:58.597 回答