我正在开发一个我们希望确保可伸缩性和性能的应用程序。
我有一个List,我正在考虑通过Redis进行缓存。这些职位是典型的公司职位,如“会计文员”,“网络管理员”,“人力资源总监”等。随着时间的推移,这些职位将有数千个。
我还想实现一个自动完成功能,当用户键入“Director”的几个字符时,我想开始提出建议。顺便说一下,该职位不必以“董事”这个词开头。换句话说,“董事”可以在中间或结尾,就像“人力资源总监”的情况一样。
我的职位存储在SQL Server数据库中。我觉得如果我要对SQL Server中的数据处理这个自动完成功能,我会遇到性能问题。
我觉得在Redis中缓存我的所有职位并在Redis中对缓存数据执行自动完成应该会给我最好的表现。但是,我从未对Redis数据进行过搜索。
有人可以给我一些关于如何针对Redis缓存数据执行此类文本搜索的指示吗?请记住,我希望能够在任何地方找到这个词,而不仅仅是在短语的开头。
P.S。我的应用程序是一个用C#编写并托管在Azure上的ASP.NET MVC应用程序。
答案 0 :(得分:1)
您可以将Sorted Set
作为按字典顺序排序的字符串集,只需为所有元素插入相同的分数。
请参阅Redis文档中的Lexicographical scores。
然后,您可以通过使用ZSCAN命令迭代匹配给定glob样式模式的元素来进行搜索。
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*");
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*");