关于heroku的Golang Redis错误

时间:2014-09-14 09:25:41

标签: heroku go redis

我很难在这个上面因为我无法在本地重现它。最初的意图是测试是否可以从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

0 个答案:

没有答案
相关问题