【问题标题】:Performing a search in Redis cached objects在 Redis 缓存对象中执行搜索
【发布时间】:2016-05-10 17:21:29
【问题描述】:

我正在开发一个我们想要确保可扩展性和性能的应用程序。

我有一个列表,我正在考虑通过 Redis 进行缓存。这些职位是典型的企业职位,例如“会计文员”、“网络管理员”、“人力资源总监”等。随着时间的推移,这些职位将有数千个。

我还想实现一个自动完成功能,当用户输入“导演”的几个字符时,我想开始提出建议。顺便说一句,该职位不必以“董事”一词开头。换言之,“Director”可以像“HR Director”一样在中间也可以在末尾。

我的职位存储在 SQL Server 数据库中。我觉得如果我要针对 SQL Server 中的数据处理这个自动完成功能,我会遇到性能问题。

我觉得在 Redis 中缓存我的所有位置并针对 Redis 中的缓存数据执行我的自动完成应该会给我最好的性能。但是,我从未对 Redis 数据进行过搜索。

有人可以给我一些关于如何对 Redis 缓存数据执行此类文本搜索的指示吗?请记住,我希望能够在任何位置找到单词,而不仅仅是在短语的开头。

附:我的应用是一个用 C# 编写并托管在 Azure 上的 ASP.NET MVC 应用。

【问题讨论】:

    标签: c# asp.net-mvc azure redis stackexchange.redis


    【解决方案1】:

    您可以将Sorted Set 作为按字典顺序排序的字符串集,只需为所有元素插入相同的分数。

    请参阅 Redis 文档中的 Lexicographical scores

    然后您可以通过使用ZSCAN 命令迭代匹配给定全局样式模式的元素来进行搜索。

    例如StackExchange.Redis:

    var cnn = ConnectionMultiplexer.Connect("localhost");
    var db = cnn.GetDatabase();
    var key = "positions";
    db.SortedSetAdd(key, "Accounting Clerk", 0);
    db.SortedSetAdd(key, "Network Administrator", 0);
    db.SortedSetAdd(key, "HR Director", 0);
    var entries = db.SortedSetScan(key, "*Director*");
    

    还有CachingFramework.Redis 有点短:

    var ctx = new Context("localhost");
    var lexSet = ctx.Collections.GetRedisLexicographicSet("positions");
    lexSet.AddRange(new [] { "Accounting Clerk", "Network Administrator", "HR Director" });
    var entries = lexSet.Match("*Director*");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2015-06-18
      • 2013-09-02
      • 2016-03-29
      • 1970-01-01
      相关资源
      最近更新 更多