2017-04-13 81 views
1

目前我製作了一些加載到Redis的LUA腳本來執行一些命令。一些函數對於所有腳本都是常見的,比如解析東西或數據轉換,我一直在腳本之間進行復制/粘貼,而不是簡單地重用它們。無法制作「要求」,因爲Redis無法知道在哪裏加載文件。如何重用將被加載到Redis的LUA腳本上的代碼?

對於我添加的每個腳本,維護噩夢變得更大!

DRY主體如何應用於這種情況? 我想到的唯一方法是T4代碼生成器

我可以做一個「LUA」文件與此代碼:

#import "DataTransformer.lua" 

T4會嘗試讀取每個文件與.lua擴展,並查找標籤#進口。對於每個#import標記將找到相應的文件並用實際代碼替換該行。這樣T4會自動複製/粘貼。

「DataTransformer」中的代碼應該分配給名爲「DataTransformer」的對象,並且導入DataTransformer的代碼可以使用對象DataTransformer。{function}來使用它。

這是否合理或者是否有更簡單的方法來實現這一點?

回答

2

TL;博士沒有 - 沒有這樣的方式,並使用T4或其他預處理程序查找和替換是最好的方式。

詳細信息:至少有兩種無證方法可以做你想做的事(一個在for_stack的答案中,另一個在全局metatable中),但你真的不應該使用它們。無證文件意味着它們可能無法在將來的版本中使用...

腳本意味着是獨立的。在運行腳本依賴關係之前,您真的不希望開始擔心。只要您使用緩存的腳本(使用SCRIPT LOADEVALSH),除了維護所有副本之外,不需要複製相同的有效負載。最好的方法是在部署之前將可重用元素從模板「注入」到腳本中。這樣你也可以獨立地對可重用項進行單元測試。

+0

我認爲OP不擔心許多複製腳本的開銷,但擔心這些腳本的管理。說,如果我修復了一個錯誤,我必須在包含重複代碼的所有腳本中修復它。 –

+0

表現也是一個問題。所以看起來預處理是正確的解決方案。如果我使用T4生成器,每當我修復腳本上的錯誤時,我就可以將它傳播給所有消費者:) –

0

您可以使用SCRIPT LOAD命令將這些功能腳本加載到緩存中,並以f_sha-code的形式在其他lua腳本中調用它們。

  1. 負載官能腳本緩存

    ./redis-cli script load "redis.call('SET', KEYS[1], ARGV[1])"

    Redis的返回此腳本的SHA代碼:在其他LUA腳本xxxx-SHA-CODE-xxxx

  2. 呼叫的功能,即f_xxxx-SHA-CODE-xxxx

    ./redis-cli eval "f_xxxx-SHA-CODE-xxxx(KEYS[1], ARGV[1]); return redis.call('GET', KEYS[1])" 1 key val

+0

儘管技術上正確,但這是一種無證方法,不應使用。 –

+0

@ItamarHaber感謝您指出。你有什麼想法,爲什麼Redis沒有任何官方方法來調用其他lua腳本? –

+0

不知道,猜 - 是:保持簡單:) –