2016-02-02 23 views
1

我正在研究一個我們希望確保可伸縮性和性能的應用程序。在Redis緩存對象中執行搜索

我有一個列表,我想通過Redis進行緩存。這些職位是典型的公司職位,如「會計文員」,「網絡管理員」,「人力資源總監」等。隨着時間的推移,將會有數千個這樣的職位。

我也想實現一個自動完成功能,當用戶輸入幾個「導演」角色時,我想開始提出建議。順便說一下,該位置不必以「導演」一詞開頭。換句話說,像「人力資源總監」一樣,「董事」可以處於中間或末尾。

我的職位存儲在SQL Server數據庫中。我感覺如果我要在SQL Server中處理這種自動完成功能,我會遇到性能問題。

我覺得在Redis中緩存我所有的職位,並在Redis中對緩存數據執行我的自動完成應該會給我最好的性能。但是,我從來沒有針對Redis數據運行搜索。

有人能給我一些關於如何對Redis緩存數據執行文本搜索的指針嗎?請記住,我希望能夠在任何地方找到這個詞,而不僅僅是在詞組的開頭。

P.S.我的應用程序是用C#編寫並託管在Azure上的ASP.NET MVC應用程序。

回答

1

只需對所有元素插入相同的分數,即可將Sorted Set作爲按字典排序的字符串集。

請參閱Lexicographical scores關於Redis文檔。

然後,您可以通過使用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*");