Golang redis.Nil判断失效

1,038 阅读1分钟

背景介绍

项目Redis仓库迁移,从 "github.com/go-redis/redis" 切换为 "github.com/go-redis/redis/v8" ,切换后报出很多异常日志,通过日志分析,定位到res.Err() != redis.Nil判断失效

切换前示例代码

package main

import (
    "fmt"
    "github.com/go-redis/redis"
)

func main() {

    cli := redis.NewClient(&redis.Options{
       Addr:     "127.0.0.1:6379",
       DB:       1,
       Password: "ZpJ9WbaQpquEt4e3oP",
    })

    res := cli.Get("ddddd")

    if res.Err() != nil && res.Err() != redis.Nil {
       panic(res.Err())
    }

    data, _ := res.Result()
    fmt.Printf("结果:%s\n", data)
}

过程很简单,取不到数据直接panic,取到输出结果为空

切换后示例代码

package main

import (
    "fmt"
    r1 "github.com/go-redis/redis"
    "github.com/go-redis/redis/v8"
)

func main() {

    cli := r1.NewClient(&r1.Options{
       Addr:     "127.0.0.1:6379",
       DB:       1,
       Password: "ZpJ9WbaQpquEt4e3oP",
    })

    res := cli.Get("ddddd")

    if res.Err() != nil && res.Err() != redis.Nil {
       panic(res.Err())
    }

    data, _ := res.Result()
    fmt.Printf("结果:%s\n", data)
}

通过示例代码可以很直观发现初始化client过程还是使用 "github.com/go-redis/redis" ,导致res.Err() != redis.Nil判断失败,最后执行到了panic

总结

示例代码很直观可以看到问题,但是实际项目中层级会很深,尤其引入外部报更难排查,可以结合go mod、断点等方式排查

有几个小建议

  1. 统一Redis包版本
  2. 及时删除go mod中不使用依赖包
  3. 最重要一点:项目稳定没事不要乱升级