当前位置: 首页 > news >正文

Go 应用中的 Redis 连接与操作

安装与模块初始化

  1. 初始化 Go 模块

    go mod init github.com/yourusername/yourrepo
    
  2. 获取 go-redis
    go-redis v9 支持最新两个 Go 版本:

    go get github.com/redis/go-redis/v9
    

建立连接

1. 最简方式

import ("context""fmt""github.com/redis/go-redis/v9"
)func main() {ctx := context.Background()client := redis.NewClient(&redis.Options{Addr:     "localhost:6379",Password: "", // 若设置了密码则填入DB:       0,  // 默认使用 DB0Protocol: 2,  // Redis 协议版本(通常无须修改)})// 测试连通性err := client.Ping(ctx).Err()if err != nil {panic(err)}fmt.Println("✅ Redis connected")
}

2. 使用连接字符串

opt, err := redis.ParseURL("redis://user:pass@localhost:6379/1")
if err != nil {panic(err)
}
client := redis.NewClient(opt)

基本读写示例

字符串操作

// 设置 key
if err := client.Set(ctx, "foo", "bar", 0).Err(); err != nil {panic(err)
}// 获取 key
val, err := client.Get(ctx, "foo").Result()
if err != nil {panic(err)
}
fmt.Println("foo =", val) // foo = bar

哈希操作

fields := []string{"model", "Deimos","brand", "Ergonom","type",  "Enduro bikes","price", "4972",
}// HSET
if n, err := client.HSet(ctx, "bike:1", fields...).Result(); err != nil {panic(err)
} else {fmt.Printf("↪ %d fields set\n", n) // ↪ 4 fields set
}// HGET
model, _ := client.HGet(ctx, "bike:1", "model").Result()
price, _ := client.HGet(ctx, "bike:1", "price").Result()
fmt.Println("model:", model, "price:", price)// HGETALL 并 Scan 到结构体
type BikeInfo struct {Model string `redis:"model"`Brand string `redis:"brand"`Type  string `redis:"type"`Price int    `redis:"price"`
}var info BikeInfo
if err := client.HGetAll(ctx, "bike:1").Scan(&info); err != nil {panic(err)
}
fmt.Printf("%+v\n", info)
// 输出:{Model:Deimos Brand:Ergonom Type:Enduro bikes Price:4972}

管道与事务(Pipelines & Transactions)

管道示例

管道(Pipeline)可将多条命令一次性发送并批量接收结果,减少网络往返:

pipe := client.Pipeline()
incr := pipe.Incr(ctx, "pipeline_counter")
pipe.Expire(ctx, "pipeline_counter", time.Hour)
results, err := pipe.Exec(ctx)
if err != nil {panic(err)
}
fmt.Println("New counter:", incr.Val(), "Results:", results)

事务示例

事务(TXPipelined)可在乐观锁或 MULTI/EXEC 模式下执行:

err := client.Watch(ctx, func(tx *redis.Tx) error {n, err := tx.Get(ctx, "key").Int()if err != nil && err != redis.Nil {return err}_, err = tx.TxPipelined(ctx, func(pipe redis.Pipeliner) error {pipe.Set(ctx, "key", n+1, 0)return nil})return err
}, "key")
if err != nil {panic(err)
}

OpenTelemetry 可观测性

在生产环境中,监控 Redis 命令性能与分布式追踪至关重要。go-redis 提供了 redisotel 插件:

import ("github.com/redis/go-redis/v9""github.com/redis/go-redis/extra/redisotel/v9"
)client := redis.NewClient(&redis.Options{ /* ... */ })// 启用追踪
if err := redisotel.InstrumentTracing(client); err != nil {panic(err)
}// 启用指标
if err := redisotel.InstrumentMetrics(client); err != nil {panic(err)
}

完成后,你的 Redis 操作将自动生成 OpenTelemetry spans 和 metrics,可接入 Jaeger、Prometheus 等后端。


生产环境最佳实践

  1. 连接池调优

    • Options.PoolSizeMinIdleConnsPoolTimeout 等参数根据业务并发场景调整。
  2. 重试与断路器

    • 对关键写操作,启用 Options.MaxRetries,并结合 github.com/sethvargo/go-retry 实现限流、退避重试。
  3. 心跳检测

    • 定期执行 PING 或自定义 Lua 脚本,检测集群节点健康。
  4. 安全加固

    • 开启 ACL、TLS 加密,避免明文传输和未授权访问。
  5. 监控与告警

    • 利用 redisotel、Redis 内置 INFO 命令及 redis_exporter 打通 Prometheus → Alertmanager → PagerDuty 告警链路。

更多资源

  • 🔗 go-redis 官方文档:https://pkg.go.dev/github.com/redis/go-redis/v9
  • 🔗 GitHub 仓库:https://github.com/redis/go-redis
  • 🔗 OpenTelemetry 支持示例:extra/redisotel/v9

通过以上内容,你已掌握使用 go-redis 在 Go 应用中进行基础操作、结构体映射、可观测集成与生产环境优化的核心要点。Happy coding!

http://www.xdnf.cn/news/667207.html

相关文章:

  • NLua性能对比:C#注册函数 vs 纯Lua实现
  • Nginx--手写脚本压缩和切分日志(也适用于docker)
  • 【Linux】进程状态优先级
  • 【QT】在QT6中读取文件的方法
  • 私服 nexus 之间迁移 npm 仓库
  • Debian 11之解决daemon.log与syslog文件占用空间过大问题
  • pyspark实践
  • [yolov11改进系列]基于yolov11引入感受野注意力卷积RFAConv的python源码+训练源码
  • 手机收不到WiFi,手动输入WiFi名称进行连接不不行,可能是WiFi频道设置不对
  • Matlab实现LSTM-SVM时间序列预测,作者:机器学习之心
  • 链表:数据结构的灵动舞者
  • Linux系统-基本指令(3)
  • 智能体赋能效率,企业知识库沉淀价值:UMI企业智脑的双轮驱动!
  • 【Quest开发】空间音频的使用
  • [AI]大模型MCP快速入门及智能体执行模式介绍
  • HJ25 数据分类处理【牛客网】
  • 小白成长之路-Linux程序与进程(一)
  • Linux 使用 Docker 安装 Milvus的两种方式
  • 记忆术-汉字部首编码记忆
  • APP广告变现,开发者如何判断对接的广告SDK安全合规?
  • CQF预备知识:一、微积分 -- 1.6.1 不定积分详解
  • ctf.show pwn入门 堆利用-前置基础 pwn142
  • 【刷题】数组拼接(超聚变暑期实习笔试)
  • MATLAB实现音频参数均衡器(PEQ)
  • 鸿蒙OSUniApp 实现的数字键盘与密码输入框组件#三方框架 #Uniapp
  • 用AxumStatusCode细化Rust Web标准格式响应
  • 动态防御新纪元:AI如何重构DDoS攻防成本格局
  • Spring Boot微服务架构(六):伪装的微服务有哪些问题?
  • npm error Cannot find module ‘negotiator‘ 的处理
  • 从Node.js到Go:如何从NestJS丝滑切换并爱上Sponge框架