在go中简单使用go-redis库

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 在go中简单使用go-redis库

前期准备

安装 Go 编程环境

首先,确保你已经安装了 Go 编程语言。你可以从 Go 官方网站 下载并安装适用于 Windows 的 Go 安装程序。安装完成后,你需要设置 Go 的环境变量,包括 GOPATHPATH

安装 Redis 数据库

你需要安装 Redis 数据库,它是一个开源的高性能键值存储数据库。在 Windows 上,你可以使用 Microsoft 提供的 Windows 版本 Redis。以下是安装步骤:

  1. 前往 Microsoft 官方的 Windows 版 Redis 页面。
  2. 下载适用于 Windows 的 Redis 安装包,根据你的系统选择 32 位或 64 位版本。
  3. 解压下载的文件到一个你喜欢的目录,例如 C:\Redis
  4. 打开命令提示符,进入解压后的 Redis 目录,运行 redis-server.exe 启动 Redis 服务器。
  5. 打开另一个命令提示符,同样进入 Redis 目录,运行 redis-cli.exe 来连接到 Redis 服务器。
  6. redis-cli.exe 中,你可以运行各种 Redis 命令,比如 set mykey "Hello" 来设置键值对。

安装 go-redis 框架

使用第三方库 go-redis 可以方便地连接到 Redis 数据库并进行操作。你可以通过以下命令来下载并安装这个库:

shell

复制代码

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

示例代码和操作步骤

运行 Redis 服务器和客户端

在你开始使用 go-redis 框架之前,确保你已经启动了 Redis 服务器和客户端。在命令提示符中,进入你的 Redis 目录,然后运行以下命令:

shell

复制代码

redis-server.exe

在另一个命令提示符中,同样进入 Redis 目录,运行以下命令来启动 Redis 客户端:

shell

复制代码

redis-cli.exe

你可以使用 monitor 命令来监控 Redis 操作。

编写示例代码

在你喜欢的代码编辑器中创建一个名为 main.go 的文件,然后复制以下示例代码到文件中:

![[Pasted image 20230827214048.png]]

输出

shell

复制代码

name: Alice
message exists

go-redis 常用功能

发布订阅

text

复制代码

package main
import (
    "fmt"
    "github.com/go-redis/redis"
)
func subscriber(client *redis.Client) {
    pubsub := client.Subscribe("mychannel")
    defer pubsub.Close()
    // 处理订阅接收到的消息
    for {
        msg, err := pubsub.ReceiveMessage()
        if err != nil {
            return
        }
        fmt.Println(msg.Channel, msg.Payload)
    }
}
func publisher(client *redis.Client) {
    for {
        // 发布消息到频道
        err := client.Publish("mychannel", "hello").Err()
        if err != nil {
            panic(err)
        }
    }
}
func main() {
    client := redis.NewClient(&redis.Options{
        Addr: "localhost:6379",
    })
    go subscriber(client)
    go publisher(client)
    <-make(chan struct{})
}
  • 通过client.Subscribe订阅了一个频道,然后在循环里接收消息。
  • 另开一个goroutine发布消息。使用go-redis可以方便地实现发布订阅模型。

消息队列

text

复制代码

package main
import (
    "fmt"
    "math/rand"
    "time"
    "github.com/go-redis/redis"
)
var client *redis.Client 
// 初始化连接
func initClient() {
    client = redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", 
        DB:       0, 
    })
}
// 生产者 - 发布消息
func producer() {
    for {
        message := rand.Intn(1000)
        err := client.LPush("queue", message).Err()
        if err != nil {
            panic(err)
        }
        fmt.Println("pushed", message)
        time.Sleep(1 * time.Second)
    }
}
// 消费者 - 处理消息
func consumer(id int) {
    for {
        message, err := client.BRPop(0, "queue").Result()
        if err != nil {
            panic(err)
        }
        fmt.Printf("consumer%d popped %s \n", id, message[1])
        time.Sleep(500 * time.Millisecond)
    }
}
func main() {
    // 初始化
    initClient()
    // 生产者goroutine
    go producer()
    // 3个消费者goroutine
    for i := 0; i < 3; i++ {
        go consumer(i)
    }
    // 阻塞主goroutine
    <-make(chan struct{}) 
}
  • 使用BRPop实现阻塞式出队,LPush入队,可以构建基于Redis的消息队列。
  • 多个消费者可以共享队列实现负载均衡

pipeline访问

Redis Pipeline实现了一种批量发送请求和响应的模式,它允许客户端在单次网络交互中缓冲并发送多个命令,然后再次单次接收所有响应。这种方式极大地减少了客户端和服务器之间的网络往返次数,优化了网络传输开销,显著提升Redis的总体吞吐量和命令处理性能。测试结果表明,Pipeline模式可以使Redis命令处理的TPS吞吐量提升数倍。同时它也减轻了客户端等待响应的时间,有效隐藏了网络通信时延。

此外,Pipeline模式下可轻松传输更大的数据包,避免小包命令多次网络传输的资源消耗。它还可以减少客户端和服务器端的CPU和内存占用。

总之,Redis Pipeline通过优化网络传输、批量命令执行等手段,极大地提升了Redis的性能,是非常重要的客户端访问优化方式。它尤其适合用于高负载、低延迟的Redis访问场景。

text

复制代码

func pipelineDemo(client *redis.Client) {
    // 创建pipeline
    pipe := client.Pipeline()
    // 添加多个命令到pipeline
    setCmd := pipe.Set("key1", "value1", 0)
    getCmd := pipe.Get("key1")
    incrCmd := pipe.Incr("counter")
    pipe.Expire("key1", time.Hour)
    // 执行pipeline
    _, err := pipe.Exec()
    if err != nil {
        panic(err)
    }
    fmt.Println("setCmd:", setCmd.Val())
    fmt.Println("getCmd:", getCmd.Val())
    fmt.Println("incrCmd:", incrCmd.Val())
}
  • pipeline通过redis.Pipeline() 创建,使用管道对象添加命令,最后调用Exec() 执行。
  • 返回的cmds包含每个命令的响应,可以依次处理。
  • 这样就可以批量的发送多个命令,优化访问Redis服务器。

访问Redis集群

text

复制代码

func clusterDemo() {
    client := redis.NewClusterClient(&redis.ClusterOptions{
        Addrs: []string{
            "127.0.0.1:7000",
            "127.0.0.1:7001", 
            "127.0.0.1:7002",
        },
    })
    err := client.Set("key", "value", 0).Err()
    if err != nil {
        panic(err)
    }
    val, err := client.Get("key").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("key", val)
    err = client.Close()
    if err != nil {
        panic(err)
    }
}
  • 通过NewClusterClient创建客户端,传入集群节点地址。
  • 然后就可以像使用单机客户端一样,直接操作集群了。
  • go-redis会自动将请求路由到正确的节点上。
  • 因此go-redis可以非常容易地访问Redis集群

事务(transaction)

text

复制代码

func transactionDemo(client *redis.Client) {
  pipe := client.TxPipeline()
  pipe.Set("key1", "value1", 0)
  pipe.Set("key2", "value2", 0)
  _, err := pipe.Exec()
  if err != nil {
    panic(err)
  }
}
  • 使用TxPipeline() 创建一个事务管道。
  • 然后将命令添加到管道中,最后调用Exec() 执行。
  • 这会将所有命令作为一个事务(transaction)发送到Redis服务器。

需要注意的是,Redis中的事务(transaction)不是一个原子操作。它只是一种将多个命令打包然后顺序执行的机制。与关系型数据库的事务不同,Redis事务中若某个命令执行失败, 后续的命令将不会继续执行, 但是不会回滚整个事务。

参考文章

go-redis开发手册 - Go语言玩转Redis的正确姿势 - 知乎 (zhihu.com)Go Redis [快速入门] (uptrace.dev)go-redis使用入门 - 掘金 (juejin.cn)www.cnblogs.com/itbsl/p/141…


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
Go API 数据安全/隐私保护
Go语言标准库概览:构建高效、可靠的软件开发基石
【2月更文挑战第8天】Go语言标准库是Go语言生态系统的重要组成部分,它为开发者提供了一系列高效、可靠的工具和函数,帮助开发者构建高质量的软件应用。本文将对Go语言标准库进行概览,介绍其组成特点、设计哲学以及使用场景与优势,帮助读者更好地理解和应用Go语言标准库。
|
4天前
|
测试技术 Go 开发者
go-carbon v2.3.8 发布,轻量级、语义化、对开发者友好的 golang 时间处理库
carbon 是一个轻量级、语义化、对开发者友好的 golang 时间处理库,支持链式调用。
30 0
|
4天前
|
数据采集 存储 Go
使用Go语言和chromedp库下载Instagram图片:简易指南
Go语言爬虫示例使用chromedp库下载Instagram图片,关键步骤包括设置代理IP、创建带代理的浏览器上下文及执行任务,如导航至用户页面、截图并存储图片。代码中新增`analyzeAndStoreImage`函数对图片进行分析和分类后存储。注意Instagram的反爬策略可能需要代码适时调整。
使用Go语言和chromedp库下载Instagram图片:简易指南
|
4天前
|
存储 缓存 NoSQL
【Go语言专栏】Go语言中的Redis操作与缓存应用
【4月更文挑战第30天】本文探讨了在Go语言中使用Redis进行操作和缓存应用的方法。文章介绍了Redis作为高性能键值存储系统,用于提升应用性能。推荐使用`go-redis/redis`库,示例代码展示了连接、设置、获取和删除键值对的基本操作。文章还详细阐述了缓存应用的步骤及常见缓存策略,包括缓存穿透、缓存击穿和缓存雪崩的解决方案。利用Redis和合适策略可有效优化应用性能。
|
4天前
|
Go 索引
Go 1.22 slices 库的更新:高效拼接、零化处理和越界插入优化
本文详细介绍了 Go 1.22 版本中 slices 库的更新内容,总结起来有三个方面:新增了 Concat 函数、对部分函数新增了零化处理的逻辑和对 Insert 函数进行了越界插入优化
100 1
Go 1.22 slices 库的更新:高效拼接、零化处理和越界插入优化
|
4天前
|
SQL 开发框架 .NET
你确定不学?Go标准库之 text/template
你确定不学?Go标准库之 text/template
10 2
|
4天前
|
运维 监控 Go
Golang深入浅出之-Go语言中的日志记录:log与logrus库
【4月更文挑战第27天】本文比较了Go语言中标准库`log`与第三方库`logrus`的日志功能。`log`简单但不支持日志级别配置和多样化格式,而`logrus`提供更丰富的功能,如日志级别控制、自定义格式和钩子。文章指出了使用`logrus`时可能遇到的问题,如全局logger滥用、日志级别设置不当和过度依赖字段,并给出了避免错误的建议,强调理解日志级别、合理利用结构化日志、模块化日志管理和定期审查日志配置的重要性。通过这些实践,开发者能提高应用监控和故障排查能力。
89 1
|
4天前
|
中间件 Go API
Golang深入浅出之-Go语言标准库net/http:构建Web服务器
【4月更文挑战第25天】Go语言的`net/http`包是构建高性能Web服务器的核心,提供创建服务器和发起请求的功能。本文讨论了使用中的常见问题和解决方案,包括:使用第三方路由库改进路由设计、引入中间件处理通用逻辑、设置合适的超时和连接管理以防止资源泄露。通过基础服务器和中间件的代码示例,展示了如何有效运用`net/http`包。掌握这些最佳实践,有助于开发出高效、易维护的Web服务。
29 1
|
4天前
|
Java 测试技术 Go
Go语言标准库进阶应用与最佳实践:提升代码质量与性能
【2月更文挑战第8天】在掌握了Go语言标准库的基础应用后,如何进一步发掘其潜力,提升代码质量和性能,是每位Go语言开发者所关心的问题。本文将探讨Go语言标准库的进阶应用与最佳实践,包括标准库与其他库的协同使用、性能优化与内存管理、错误处理与异常捕获、标准库在实际项目中的应用案例,以及推荐的最佳实践与编程规范。通过深入了解这些内容,开发者能够更好地利用Go语言标准库,提升代码质量与性能,构建出更加高效、可靠的软件应用。
|
4天前
|
算法 安全 Go
Go语言标准库核心模块详解:构建高效应用的基石
【2月更文挑战第8天】Go语言标准库中的核心模块为开发者提供了构建高效应用所需的基础功能和工具。本文将深入探讨Go语言标准库中的几个核心模块,包括容器与集合、并发与并行、输入输出、时间与日期、字符串处理以及加密与安全,帮助读者更好地理解和应用这些核心模块,为构建高效应用打下坚实基础。