2015-02-10 71 views
0

我正在使用Scredis,一個scala Redis庫。爲了實例化一個Redis對象,我必須將它傳遞給一個配置和配置值的路徑。 (據我所知,沒有其他方法可以給Redis對象的主機名和端口)無法將環境變量導入到application.conf中

基本上,我需要將Redis端口和主機名保存在配置中。現在的問題是我試圖用Heroku來部署它,並且主機名和端口都駐留在一個環境變量中。我已經瞭解到,我可以從application.conf中訪問env vars,但由於它們存儲爲一個長字符串,所以在將它傳遞給Redis對象之前,我無法分解它。我知道如何從代碼中的env var中獲取env var,但是看到我無法直接通過它,所以我完全喪失瞭如何做到這一點。

這裏是Scredis配置信息:https://github.com/Livestream/scredis/wiki/Configuration

使用Redis的云爲在Heroku上的java /斯卡拉: https://devcenter.heroku.com/articles/rediscloud#using-redis-from-java

+0

這是什麼一個長字符串?你可以在Heroku中爲'REDIS_HOST'和'REDIS_PORT'設置env變量嗎? – colinjwebb 2015-02-10 08:10:19

回答

2

根據these examplesscredis,也可以創建一個將配置放置在代碼中的客戶端。

// Creates a non-blocking client with provided parameters, falling back to default 
// configuration for non-provided parameters. 
val clientWithParameters = Client(
    host = "192.168.1.1", 
    port = 6380, 
    passwordOpt = Some("foobar") 
) 

所以,兩者的僞組合很可能是這樣的:

val redisUri = URI(System.getenv("REDISCLOUD_URL")) 
val redisClient = Client(
    host = redisUri.getHost(), 
    port = redisUri.getPort(), 
    passwordOpt = redisUri.getPassword() 
) 
+0

我知道這是向你展示這個問題的好主意 - 你的答案更好:) – 2015-02-10 10:59:16

1

免責聲明 - 我不是專家斯卡拉:)

它看起來像scredis通過application.conf和Typesafe配置庫進行配置,因此一種這樣做是在動態啓動時生成fly。

根據Heroku's build behavior for Scala,執行此操作的方法是在必需的stage任務中添加啓動腳本。在你的情況下,啓動腳本應該解析REDISCLOUD_URL env var的內容並將它們寫入application.conf文件。

2

類型安全的配置,從而發揮框架使得這個非常容易讓你因爲類型安全配置還加載環境變量來解決配置值。你基本上有兩種選擇。

選項1:確保環境變量與配置密鑰scredis預期的名稱相同。這是在你想改變在啓動時給定的配置值情況下非常有用 - 例如,你有以下application.conf

{ 
    foo = bar 
} 

但在運行時你想要的foo值是baz。然後,您可以通過環境變量或-D傳遞新值。

$ foo=baz activator run 
$ activator run -Dfoo=baz 

選項2:在你application.conf有一個佔位符來讀取環境變量。假設環境變量的Heroku通過你REDIS_HOSTREDIS_PORT,然後在你的application.conf,你可以做到以下幾點:

scredis { 
    redis { 
    host = ${REDIS_HOST} 
    port = ${REDIS_PORT} 
    } 
}