背景介绍
项目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、断点等方式排查
有几个小建议
- 统一Redis包版本
- 及时删除go mod中不使用依赖包
- 最重要一点:项目稳定没事不要乱升级