我正在使用 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 会有帮助吗?
最佳答案
问题在于您如何使用 Redis,即 songRedis.GetAll()
下载整个数据集,将所有实体反序列化为 C# 对象并在客户端执行搜索。
您永远不应该在客户端(即任何数据存储)上通过网络下载和查询整个数据集,即使是完整的服务器端表扫描查询也会执行得更好,因为只有过滤后的结果会返回给客户端,并且不是整个数据集。理想情况下,甚至应该避免完整的服务器端表扫描,并且应该通过索引进行任何查询。
Redis 不支持内置索引,但需要时您可以使用 SET to manually create indexes between entities in Redis .
关于wpf - ServiceStack Redis 搜索很慢。如何优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27023692/