Redis
Redis
| 名称 | 特点 | 适用场景 |
|---|---|---|
go-redis | Redis 官方 Go 客户端,API 直观、功能完整 | 大多数业务项目的默认选择 |
rueidis | 自动 Pipeline、客户端缓存、低内存分配 | 对延迟和吞吐量要求较高的项目 |
Redigo | API 简单、依赖少,通过字符串执行命令 | 存量 Redigo 项目或偏好轻量客户端的场景 |
新项目通常优先使用 go-redis;只有在性能测试表明客户端成为瓶颈,或需要服务器辅助的客户端缓存时,再考虑 rueidis。
下面的示例都操作同一个键,并省略客户端初始化和错误处理:
const key = "user:1"
go-redis
命令与 Redis 命令基本一一对应,并提供强类型返回值。
rdb.Set(ctx, key, "Alice", time.Hour) // 写,并设置过期时间
name, _ := rdb.Get(ctx, key).Result() // 读
rdb.Del(ctx, key) // 删
Pipeline 通过回调集中组装命令:
_, err := rdb.Pipelined(ctx, func(pipe redis.Pipeliner) error {
pipe.Set(ctx, "user:1", "Alice", 0)
pipe.Set(ctx, "user:2", "Bob", 0)
return nil
})
rueidis
使用命令构建器组装类型安全的 Redis 命令。
client.Do(ctx, client.B().Set().Key(key).Value("Alice").Build()).Error() // 写
name, _ := client.Do(ctx, client.B().Get().Key(key).Build()).ToString() // 读
client.Do(ctx, client.B().Del().Key(key).Build()).Error() // 删
rueidis 会自动合并多个 goroutine 发出的非阻塞命令,也可以使用 DoMulti 手动批量执行:
responses := client.DoMulti(ctx,
client.B().Set().Key("user:1").Value("Alice").Build(),
client.B().Set().Key("user:2").Value("Bob").Build(),
)
Redigo
通过 Do 执行原始 Redis 命令,返回值需要使用辅助函数转换。
conn.Do("SET", key, "Alice", "EX", 3600) // 写,并设置过期时间
name, _ := redis.String(conn.Do("GET", key)) // 读
conn.Do("DEL", key) // 删
Pipeline 需要依次发送命令,再统一刷新和接收结果:
conn.Send("SET", "user:1", "Alice")
conn.Send("SET", "user:2", "Bob")
conn.Flush()
conn.Receive()
conn.Receive()