我很难在这个上面因为我无法在本地重现它。最初的意图是测试是否可以从go方法访问Redis连接,如果是,则继续通知。
在我的代码中:
if os.Getenv("REDISTOGO_URL") != "" {
host, password = parseRedistogoUrl()
} else {
host = "tcp:localhost:6379"
password = ""
}
db := 0
redis = godis.New(host, db, password)
// Try to set a "dummy" value:
err = redis.Set("INIT", time.Now().UTC())
如果Redis服务器在本地可用,则执行时不会出现错误,但在heroku上会失败。
使问题更有趣的是,如果最后一行(带有err
)被注释掉,那么程序中的下一个redis.Set
成功,这表明服务器可以在以后访问,但是不是"就在"之后实例化。关于如何解决这个问题的任何想法? godis.New(...)
是否异步运行?
更新:这是当前从https://gist.github.com/TheDudeWithTheThing/6468746使用的解析功能:
func ParseRedistogoUrl() (string, string) {
redisUrl := os.Getenv("REDISTOGO_URL")
redisInfo, _ := url.Parse(redisUrl)
server := redisInfo.Host
password := ""
if redisInfo.User != nil {
password, _ = redisInfo.User.Password()
}
return server, password
}
使用redigo和https://github.com/soveran/redisurl重写相同的方法:
// Gets redis instance from configuration parameters or environment's REDISTOGO_URL.
func redis_instance() (redis_con redis.Conn, err error) {
if os.Getenv("REDISTOGO_URL") != "" {
redis_con, err = redisurl.ConnectToURL(os.Getenv("REDISTOGO_URL"))
} else {
redis_con, err = redis.Dial("tcp", ":6379")
}
if err != nil {
return
}
// Try to set a "dummy" value, panic if redis is not accessible.
err = redis_con.Send("Set", "INIT", time.Now().UTC())
return
}
来自节目的主要内容:
redis, err := redis_instance()
redis.Send("Set", "SOMETHING", "ELSE")
if err != nil {
log.Critical("Cannot access Redis server")
log.Critical(fmt.Sprintf("%s", err))
os.Exit(2)
}
在日志中,我得到以下输出:
2014-09-16T18:15:10.084908 + 00:00 app [web.1]:2014/09/16 18:15:10 CRITICAL003无法访问Redis服务器
2014-09-16T18:15:10.084974 + 00:00 app [web.1]:2014/09/16 18:15:10 CRITICAL004连接错误10942
关于redis访问:
~ $ echo $REDISTOGO_URL
redis://redistogo:47███████████@hoki.redistogo.com:10███/
~ $ ping hoki.redistogo.com
bash: ping: command not found
~ $ nc hoki.redistogo.com 10███
flushdb
-NOAUTH Authentication required.
AUTH 47███████████
+OK
get XXX
$-1
set XXX 2
+OK
get XXX
$1
2