Go 连接 Redis 代码详细解析

下面这段代码:

go 复制代码
package main

import (
	"context"
	"fmt"

	"github.com/redis/go-redis/v9"
)

var ctx = context.Background()

func main() {

	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})

	result, err := rdb.Ping(ctx).Result()

	if err != nil {
		panic(err)
	}

	fmt.Println(result)
}

它的作用其实非常简单:

txt 复制代码
连接 Redis
↓
测试 Redis 是否正常

如果连接成功:

输出:

txt 复制代码
PONG

一、整体运行流程

整个程序执行流程:

txt 复制代码
程序启动
↓
创建 Redis 客户端
↓
连接 Redis
↓
发送 Ping
↓
Redis 返回 PONG
↓
打印结果

二、package main

go 复制代码
package main

表示:

txt 复制代码
这是一个可执行程序

Go 里面:

只有:

go 复制代码
package main

才能运行。


三、import 导入包

go 复制代码
import (
	"context"
	"fmt"

	"github.com/redis/go-redis/v9"
)

1. fmt

go 复制代码
"fmt"

Go 标准库。

用于:

txt 复制代码
打印输出

例如:

go 复制代码
fmt.Println("hello")

2. context

go 复制代码
"context"

这个是:

txt 复制代码
上下文对象

很多新人:

第一次看到:

go 复制代码
ctx

会懵。

实际上:

它本质上是:

txt 复制代码
请求生命周期管理器

Redis、MySQL、Gin:

现在很多库都要求传 context。


四、为什么 Redis 要 context

例如:

txt 复制代码
Redis 查询超时怎么办?
请求取消怎么办?

context 就是管理这些东西。


context.Background()

go 复制代码
var ctx = context.Background()

意思:

txt 复制代码
创建一个最基础的上下文

可以理解成:

txt 复制代码
先创建一个默认的上下文对象

后面:

Redis 操作都需要它。


五、github.com/redis/go-redis/v9

go 复制代码
"github.com/redis/go-redis/v9"

这是:

txt 复制代码
Go 操作 Redis 的官方主流库

类似:

txt 复制代码
Gin 是 Web 框架
Gorm 是 ORM
go-redis 是 Redis 客户端

六、redis.NewClient()

go 复制代码
rdb := redis.NewClient(...)

作用:

txt 复制代码
创建 Redis 客户端

你可以理解成:

txt 复制代码
创建一个 Redis 连接工具

后面:

所有 Redis 操作:

都通过:

go 复制代码
rdb

进行。


七、redis.Options{}

go 复制代码
redis.Options{
	Addr:     "localhost:6379",
	Password: "",
	DB:       0,
}

这是:

txt 复制代码
Redis 连接配置

类似:

txt 复制代码
MySQL 的 DSN

八、Addr 是什么

go 复制代码
Addr: "localhost:6379"

表示:

txt 复制代码
Redis 服务器地址

localhost

txt 复制代码
当前电脑

6379

Redis 默认端口。

所以:

txt 复制代码
localhost:6379

意思:

txt 复制代码
连接本机 Redis

九、Password

go 复制代码
Password: ""

Redis 密码。

如果 Redis 没设置密码:

txt 复制代码
写空字符串

如果有密码:

go 复制代码
Password: "123456"

十、DB

go 复制代码
DB: 0

Redis 有:

txt 复制代码
多个逻辑数据库

默认:

txt 复制代码
0~15

总共:

txt 复制代码
16个库

示例

txt 复制代码
DB 0
DB 1
DB 2
...

为什么有多个 DB

用于:

txt 复制代码
数据隔离

例如:

DB 用途
0 用户
1 缓存
2 验证码

但真实开发:

很多公司:

txt 复制代码
只用 DB 0

十一、rdb 到底是什么

go 复制代码
rdb := redis.NewClient(...)

这里:

go 复制代码
rdb

本质:

是:

txt 复制代码
Redis客户端对象

后面:

所有 Redis 操作:

都靠它。

例如:

go 复制代码
rdb.Set()
rdb.Get()
rdb.Del()

十二、Ping 是什么

go 复制代码
result, err := rdb.Ping(ctx).Result()

很多协议:

都有:

txt 复制代码
Ping

作用:

txt 复制代码
测试连接是否正常

十三、Redis Ping 流程

程序:

txt 复制代码
发送:
PING

Redis:

返回:

txt 复制代码
PONG

就像:

txt 复制代码
你在吗?
我在。

十四、这一行到底发生了什么

go 复制代码
result, err := rdb.Ping(ctx).Result()

拆开理解。


第一步

go 复制代码
rdb.Ping(ctx)

向 Redis 发:

txt 复制代码
PING

第二步

go 复制代码
.Result()

获取执行结果。


第三步

返回:

go 复制代码
result
err

result

Redis 返回的数据:

txt 复制代码
PONG

err

错误信息。

如果连接失败:

go 复制代码
err != nil

十五、为什么 Go 都返回 err

Go 里面:

很多函数:

都会:

go 复制代码
返回 值 + err

例如:

go 复制代码
value, err := xxx()

这是 Go 核心思想:

txt 复制代码
显式错误处理

十六、panic(err)

go 复制代码
if err != nil {
	panic(err)
}

意思:

txt 复制代码
如果发生错误
程序直接崩溃
并打印错误

例如:

Redis 没启动:

会报:

txt 复制代码
connect refused

十七、fmt.Println(result)

go 复制代码
fmt.Println(result)

打印:

txt 复制代码
PONG

说明:

txt 复制代码
Redis连接成功

十八、整个底层流程(真正理解)

txt 复制代码
main()
↓
创建 context
↓
创建 Redis 客户端
↓
根据 Addr 连接 Redis
↓
发送 PING
↓
Redis 返回 PONG
↓
打印结果

十九、为什么很多教程第一步都是 Ping

因为:

真正 Redis 操作之前:

必须先确认:

txt 复制代码
Redis能不能连上

否则:

后面:

txt 复制代码
SET
GET
DEL

都会失败。


二十、后面 Redis 操作都会长这样

例如:


SET

go 复制代码
rdb.Set(ctx, "name", "zhangsan", 0)

GET

go 复制代码
rdb.Get(ctx, "name")

DEL

go 复制代码
rdb.Del(ctx, "name")

你会发现:

txt 复制代码
所有操作都需要:
rdb + ctx

因为:

txt 复制代码
rdb 是 Redis 客户端
ctx 是上下文

二十一、最后一句总结

这段代码本质:

txt 复制代码
创建 Redis 客户端
↓
连接 Redis
↓
发送 PING 测试
↓
返回 PONG

真正核心:

txt 复制代码
rdb 是 Redis 操作对象
ctx 是上下文
Options 是连接配置
Ping 用于测试连接
相关推荐
测试员周周7 小时前
【AI测试路线图2】功能测试转 AI 测试:4~5 个月,一条最稳的路
开发语言·人工智能·python·功能测试·测试工具·单元测试·pytest
多敲代码防脱发7 小时前
Spring进阶(Bean的生命周期与Bean的后处理器)
java·服务器·开发语言·spring boot·spring·servlet
吃好睡好便好7 小时前
在Matlab中绘制峰值图
开发语言·学习·算法·matlab·信息可视化
成为你的宁宁7 小时前
【基于 K8S+NFS 动态存储实战部署 Redis-Cluster 集群(含三主三从配置与访问配置)】
redis·容器·kubernetes
兩尛7 小时前
std::shared_mutex、std::mutex和std::recursive_mutex是什么锁
开发语言·c++·算法
A-刘晨阳7 小时前
用树莓派搭一个弱网模拟网关,让你的应用在2G、高延迟、丢包环境下跑一遍
开发语言·php
流年如夢7 小时前
类和对象(上)
android·java·开发语言
kyle~8 小时前
查找---插值查找(二分查找的改进版本)
开发语言·c++
高翔·权衡之境8 小时前
主题7:缓存与队列——速度不匹配的通用解
开发语言·人工智能·物联网·缓存·信息与通信·信号处理