Redigo:在尝试连接到连接池时出现无效的内存地址或空指针解引用。

huangapple go评论110阅读模式
英文:

Redigo: Invalid memory address or nil pointer dereference while attempting to connect to pool

问题

> Redis连接中.....!恐慌:运行时错误:无效的内存地址或空指针解引用[信号0xb code=0x1 addr=0x28 pc=0x40154b] goroutine 1 [运行中]:runtime.panic(0x52c6e0, 0x6b6348) /usr/lib/go/src/pkg/runtime/panic.c:266 +0xb6 main.func·001(0xc21005102c, 0x0, 0x4bcd4c, 0x1) /home/vinay10949/redischeck/redischeck.go:21 +0x10b github.com/garyburd/redigo/redis.(*Pool).get(0xc210051000, 0x0, 0xc2100378f0, 0x42dbdf, 0x7fbe9c177070) /usr/lib/go/src/pkg/github.com/garyburd/redigo/redis/pool.go:250 +0x3a2 github.com/garyburd/redigo/redis.(*Pool).Get(0xc210051000, 0x1, 0x1) /usr/lib/go/src/pkg/github.com/garyburd/redigo/redis/pool.go:150 +0x27 main.main() /home/vinay10949/redischeck/redischeck.go:29 +0x13e

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/garyburd/redigo/redis"
  6. //"reflect"
  7. )
  8. var (
  9. redisAddress = flag.String("10.12.2.121", "10.12.2.121:6379", "Redis服务器地址")
  10. maxConnections = flag.Int("max-connections", 10, "Redis最大连接数")
  11. )
  12. func main() {
  13. //Redis连接
  14. redisPool := redis.NewPool(func() (redis.Conn, error) {
  15. con, err := redis.Dial("tcp", *redisAddress)
  16. con.Do("SELECT", 1)
  17. if err != nil {
  18. return nil, err
  19. }
  20. return con, err
  21. }, *maxConnections)
  22. fmt.Println("Redis连接中...!")
  23. con := redisPool.Get()
  24. status, errStatus := con.Do("SET", "Name", "BookMyShow")
  25. if errStatus != nil {
  26. fmt.Println(errStatus)
  27. } else {
  28. fmt.Println("Redis已连接")
  29. }
  30. statusInsertion, _ := redis.String(status, errStatus)
  31. fmt.Println("插入状态:" + statusInsertion)
  32. value, _ := redis.String(con.Do("GET", "Name"))
  33. fmt.Println("检索到的值:" + value)
  34. }

这是一个使用Go语言编写的Redis连接代码。它尝试连接到指定的Redis服务器,并执行一些操作。在你提供的代码中,出现了一个运行时错误,导致程序崩溃。你可能需要检查代码中的错误,并确保Redis服务器的连接设置正确。

英文:

> Redis Connecting.....! panic: runtime error: invalid memory address or
> nil pointer dereference [signal 0xb code=0x1 addr=0x28 pc=0x40154b]
> goroutine 1 [running]: runtime.panic(0x52c6e0, 0x6b6348)
> /usr/lib/go/src/pkg/runtime/panic.c:266 +0xb6
> main.func·001(0xc21005102c, 0x0, 0x4bcd4c, 0x1)
> /home/vinay10949/redischeck/redischeck.go:21 +0x10b
> github.com/garyburd/redigo/redis.(*Pool).get(0xc210051000, 0x0,
> 0xc2100378f0, 0x42dbdf, 0x7fbe9c177070)
> /usr/lib/go/src/pkg/github.com/garyburd/redigo/redis/pool.go:250
> +0x3a2 github.com/garyburd/redigo/redis.(*Pool).Get(0xc210051000, 0x1, 0x1) > /usr/lib/go/src/pkg/github.com/garyburd/redigo/redis/pool.go:150
> +0x27 main.main() /home/
>
> vinay10949/redischeck/redischeck.go:29 +0x13e

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/garyburd/redigo/redis"
  6. //"reflect"
  7. )
  8. var (
  9. redisAddress = flag.String("10.12.2.121", "10.12.2.121:6379", "Address to the Redis server")
  10. maxConnections = flag.Int("max-connections", 10, "Max connections to Redis")
  11. )
  12. func main() {
  13. //Redis Connection
  14. redisPool := redis.NewPool(func() (redis.Conn, error) {
  15. con, err := redis.Dial("tcp", *redisAddress)
  16. con.Do("SELECT", 1)
  17. if err != nil {
  18. return nil, err
  19. }
  20. return con, err
  21. }, *maxConnections)
  22. fmt.Println("Redis Connecting...!")
  23. con := redisPool.Get()
  24. status, errStatus := con.Do("SET", "Name", "BookMyShow")
  25. if errStatus != nil {
  26. fmt.Println(errStatus)
  27. } else {
  28. fmt.Println("Redis Connected")
  29. }
  30. statusInsertion, _ := redis.String(status, errStatus)
  31. fmt.Println("Status of Insertion :" + statusInsertion)
  32. value, _ := redis.String(con.Do("GET", "Name"))
  33. fmt.Println("Value Retrieved : " + value)
  34. }

答案1

得分: 5

你犯了一个错误,是在使用返回值之后才检查错误:

  1. con, err := redis.Dial("tcp", *redisAddress)
  2. con.Do("SELECT", 1) // 在这里你正在使用可能为nil的con
  3. if err != nil {
  4. return nil, err
  5. }

请重新排列代码:

  1. con, err := redis.Dial("tcp", *redisAddress)
  2. if err != nil {
  3. return nil, err
  4. }
  5. con.Do("SELECT", 1) // 在检查错误之后再使用con
英文:

You are making the mistake of checking for an error after using the returned value:

  1. con, err := redis.Dial("tcp", *redisAddress)
  2. con.Do("SELECT", 1) // Here you are using con which most likely is nil
  3. if err != nil {
  4. return nil, err
  5. }

Rearrange the code to:

  1. con, err := redis.Dial("tcp", *redisAddress)
  2. if err != nil {
  3. return nil, err
  4. }
  5. con.Do("SELECT", 1) // con should be used after checking for errors

答案2

得分: 0

con, err := redis.Dial("tcp", *redisAddress)
if err != nil {
return nil, err
}
con.Do("SELECT", 0) //选择0号数据库,用于Nutcracker

英文:
  1. con, err := redis.Dial("tcp", *redisAddress)
  2. if err != nil {
  3. return nil, err
  4. }
  5. con.Do("SELECT", 0) //Select 0 for Nutcracker

huangapple
  • 本文由 发表于 2015年8月5日 16:00:22
  • 转载请务必保留本文链接:https://go.coder-hub.com/31826666.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定