下面这段代码:
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 用于测试连接