ServiceStack Redis搜索速度很慢。如何优化?

时间:2014-11-19 17:57:31

标签: wpf elasticsearch redis servicestack.redis

我正在使用ServiceStack.Redis来实现一个演示项目。它包含两个POCO,即专辑及其歌曲。

以下是使用秒表实例测量的搜索结果:

Time elapsed searching 5804 items is 00:00:00.1243984 <-- Albums
Time elapsed searching 138731 items is 00:00:02.0592068 <-- Songs

正如您所看到的,搜索歌曲花费了太多时间。我在WPF应用程序中显示结果,其中也输入了搜索词。 redis的延迟是暂时的。

以下是用于搜索的代码:

IEnumerable<int> songsFromRedis =
    songRedis.GetAll()
    .Where(song => song.Title != null 
        &&  song.Title.ToLowerInvariant().Contains(searchText))
    .OrderBy(song => song.Title)
    .Select(x => x.AlbumId);

如果我们不能加快速度,ElasticSearch会帮忙吗?

2 个答案:

答案 0 :(得分:2)

问题在于您如何使用Redis,即songRedis.GetAll()下载整个数据集,将所有实体反序列化为C#对象并在客户端上执行搜索。

您永远不应该在客户端上通过网络下载和查询整个数据集(即使用任何数据存储区),即使完整的服务器端表扫描查询也会执行得更好,因为只有过滤后的结果才会返回给客户端,不是整个数据集。理想情况下,应该避免完整的服务器端表扫描,并且应该通过索引进行任何查询。

Redis并不支持内置索引,但在需要时您可以使用SET to manually create indexes between entities in Redis

答案 1 :(得分:1)

任何面向搜索的数据库都会有所帮助。即使是mysql全文搜索,这也是非常慢的,在这里会好很多。

Elasticsearch是一个不错的选择,Sphinx是另一个不错的选择。 ES具有简单的可扩展性和易用性,sphinx具有性能优势和其他大多数常见功能,但是需要学习和扩展。