2015-09-09 50 views
2

我創造主要在非網絡環境,通過StackExchange.Redis利用Lua腳本的使用庫。我們需要使用StackExchange.Redis當緩存加載的腳本?

我們是否應該加載Lua腳本爲每一個評估呼叫使用StackExchange.Redis時,像

var prepped = LuaScript.Prepare(_someScript); 
var loaded = prepped.Load(someServer); 
loaded.Evaluate(someDb); 

還是應該被裝載一次,然後每一個我們要評估他們及時重用LoadedLuaScript實例一個給定的過程?

回答

1

腳本應該加載一次,在啓動,並保持LoadedLuaScript情況需要時評估。 StackExchange.Redis不會將LoadedLuaScripts緩存到任何地方,因此如果您在每次調用時都要經過準備和加載過程,那麼您只需要使用StackExchange.Redis將該腳本轉移到Redis,在Redis中它將被散列,Redis會意識到,它已經擁有它,然後通過哈希回來。

如果你的進程無法啓動頻繁(對於一些經常值),那麼它可能是合理的,在啓動時加載的所有腳本,即使它們已經加載的Redis不已,因爲它不會導致多這些腳本的實例在Redis中緩存。你可以保持LoadedLuaScripts提供一個簡單的緩存,如:

private static readonly string _helloScript = 
      "print(\"Hello World!\")" 
     ; 

    public void LoadScripts(IDatabase db, IServer srv) 
    { 
     var scripts = new Dictionary<string, string> 
     { 
      { "sayHello",      _helloScript }, 
     }; 

     foreach (var scriptName in scripts.Keys) 
     { 
      var prepped = LuaScript.Prepare(scripts[scriptName]); 

      _scripts.Add(scriptName, prepped.Load(srv)); 
     } 
    } 

    public void SayHello(IDatabase db) 
    { 
     _scripts["sayHello"].Evaluate(db); 
    } 
相關問題