在Redis缓存对象

时间:2016-02-02 03:15:38

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

我正在开发一个我们希望确保可伸缩性和性能的应用程序。

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

我还想实现一个自动完成功能,当用户键入“Director”的几个字符时,我想开始提出建议。顺便说一下,该职位不必以“董事”这个词开头。换句话说,“董事”可以在中间或结尾,就像“人力资源总监”的情况一样。

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

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

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

P.S。我的应用程序是一个用C#编写并托管在Azure上的ASP.NET MVC应用程序。

1 个答案:

答案 0 :(得分:1)

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

请参阅Redis文档中的Lexicographical scores

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

例如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*");