首页 > 数据库 >【全】Go 操作Redis数据库

【全】Go 操作Redis数据库

时间:2024-10-31 12:20:15浏览次数:3  
标签:redis err Redis 数据库 ctx 用法 rdb Go

操作 Redis 数据库在 Go 语言中是一项常见的任务,尤其是在构建高性能应用时。以下是一个关于如何使用 Go 操作 Redis 的详细指南,涵盖了从安装、配置到不同数据类型操作的各个层次(初级、中级、高级)。

1. Go 操作 Redis 实战介绍

Redis 是一个开源的内存数据结构存储,支持多种数据结构如字符串、哈希、列表、集合和有序集合等。它通常用于缓存、会话存储、消息队列等场景。Go 程序员通常会使用 go-redis 库来与 Redis 进行交互。

初级用法

介绍:基础连接与简单的 GET/SET 操作。

package main

import (
    "context"
    "fmt"
    "github.com/go-redis/redis/v8"
)

var ctx = context.Background()

func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })

    err := rdb.Set(ctx, "key", "value", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := rdb.Get(ctx, "key").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("key", val)
}

中级用法

介绍:处理连接池和超时机制。

rdb := redis.NewClient(&redis.Options{
    Addr:         "localhost:6379",
    Password:     "",
    DB:           0,
    PoolSize:     10,             // 最大连接数
    MinIdleConns: 3,              // 最小空闲连接数
    DialTimeout:  5 * time.Second, // 连接超时时间
})

高级用法

介绍:实现分布式锁。

func acquireLock(rdb *redis.Client, lockKey string, timeout time.Duration) bool {
    success, err := rdb.SetNX(ctx, lockKey, "locked", timeout).Result()
    if err != nil || !success {
        return false
    }
    return true
}

2. Redis 安装

初级用法

介绍:通过包管理器安装。

# Ubuntu/Debian
sudo apt-get update
sudo apt-get install redis-server

中级用法

介绍:从源码编译安装。

wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make
sudo make install

高级用法

介绍:配置 Redis 集群。

# Run following commands for each node in the cluster
redis-server --cluster-enabled yes --cluster-config-file nodes.conf --cluster-node-timeout 5000 --appendonly yes

3. 配置定义和打开连接

初级用法

介绍:设置基本连接参数。

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

中级用法

介绍:使用配置文件管理连接参数。

# config.yaml
redis:
  addr: "localhost:6379"
  password: ""
  db: 0

高级用法

介绍:动态加载配置并热更新。

// Watch changes in configuration and apply them without restarting

4. String 字符串操作

初级用法

介绍:基本的 SET 和 GET 操作。

err := rdb.Set(ctx, "mykey", "hello", 0).Err()
val, err := rdb.Get(ctx, "mykey").Result()

中级用法

介绍:字符串计数器。

rdb.Incr(ctx, "counter")

高级用法

介绍:实现分布式 ID 生成器。

5. Hash 操作 - 用户画像应用

初级用法

介绍:简单地设置和获取哈希字段。

rdb.HSet(ctx, "user:1000", "name", "John", "age", "30")
name, err := rdb.HGet(ctx, "user:1000", "name").Result()

中级用法

介绍:批量获取用户信息。

userInfo, err := rdb.HGetAll(ctx, "user:1000").Result()

高级用法

介绍:使用管道(pipeline)提高性能。

pipe := rdb.Pipeline()
pipe.HSet(ctx, "user:1001", "name", "Alice", "age", "28")
pipe.HSet(ctx, "user:1002", "name", "Bob", "age", "25")
_, err := pipe.Exec(ctx)

6. List 操作

初级用法

介绍:添加和取出列表元素。

rdb.RPush(ctx, "mylist", "item1", "item2")
items, err := rdb.LRange(ctx, "mylist", 0, -1).Result()

中级用法

介绍:阻塞弹出元素(如队列消费者)。

item, err := rdb.BLPop(ctx, 0*time.Second, "queue").Result()

高级用法

介绍:将列表作为消息通道进行实时通信。

7. Set 操作

初级用法

介绍:添加和检查元素。

rdb.SAdd(ctx, "myset", "element1", "element2")
exists, err := rdb.SIsMember(ctx, "myset", "element1").Result()

中级用法

介绍:集合运算(如交集)。

commonElements, err := rdb.SInter(ctx, "set1", "set2").Result()

高级用法

介绍:利用集合实现推荐系统中的共同好友算法。

8. ZSet 实现微博热榜

初级用法

介绍:基本的添加与查询有序集合。

rdb.ZAdd(ctx, "leaderboard", &redis.Z{Score: 100.0, Member: "user1"})
topUsers, err := rdb.ZRevRangeWithScores(ctx, "leaderboard", 0, 10).Result()

中级用法

介绍:分页显示排行榜。

高级用法

介绍:定期清理得分低的用户。

9. 消息队列

初级用法

介绍:使用列表模拟简单队列。

中级用法

介绍:Pub/Sub 模型发布和订阅消息。

pubsub := rdb.Subscribe(ctx, "channel1")

// Listen for messages
go func() {
    ch := pubsub.Channel()
    for msg := range ch {
        fmt.Println(msg.Channel, msg.Payload)
    }
}()

// Publish a message
rdb.Publish(ctx, "channel1", "Hello world!")

高级用法

介绍:实现可靠的消息传递和确认机制。


部署场景

在生产环境中,我们可以将 Redis 运行在专用服务器或容器中,并对其进行监控。Redis Sentinel 可以用来提供自动故障转移,而 Redis Cluster 支持数据分片以提高伸缩性。

原理解释

  • 单线程模型:Redis 使用单线程处理请求,这样避免了线程间切换的开销。
  • 内存存储:数据全部存于内存中,提供极高的读写速度。
  • 持久化选项:可以选择 RDB 或 AOF 方式进行数据持久化。

流程图

[Application] -> [Redis Client (Go)] -> [Redis Server]

总结

Redis 提供了一套简洁而强大的 API,用于处理各种数据结构。结合 Go 的高效并发能力,可以在不同的项目中实现丰富的功能,从缓存到复杂的数据分析均可胜任。

未来展望

随着 Redis 社区的发展和对新需求的不断响应,我们可以期待更多高级特性的引入,如增强的模块支持、更好的持久化策略以及智能缓存过期机制等。这些发展将继续帮助开发者提高应用程序的性能和稳定性。

材料链接

标签:redis,err,Redis,数据库,ctx,用法,rdb,Go
From: https://blog.csdn.net/feng1790291543/article/details/142755694

相关文章

  • 数据库
    数据库事务事务(Transaction)指一个操作,由多个步骤组成,要么全部成功,要么全部失败。举例:转账,假设A账户向B账号转账,那么涉及两个操作:从A账户扣钱。往B账户加入等量的钱。在这种场景下,不能A账户扣了钱,B账户却没加钱的情况,要么同时成功,要么同时失败并回滚。事务四大特性A......
  • 《向量数据库指南》——Milvus Cloud 过滤功能:轻松驾驭大规模数据搜索
    各位向量数据库领域的探索者们,大家好!我是大禹智库的向量数据库高级研究员王帅旭,也是《向量数据库指南》的作者。今天,咱们就来聊聊在使用MlivusCloud时,标量过滤这一强大功能是如何发挥作用的,以及如何通过这一功能实现更高效、更精准的向量数据处理。相信我,这不仅仅是一场技术盛......
  • Python+Django框架山西太原二手房数据可视化大屏系统开题报告参考
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • MongoDB 部署指南:从 Linux 到 Docker 的全面讲解
    一、MongoDB简介MongoDB是一种NoSQL数据库,以文档模型存储数据,具备高性能、弹性扩展性和分布式架构等特点,非常适用于高并发和大数据量的场景。本文将从Linux和Docker环境开始讲解,帮助读者在不同环境下顺利部署MongoDB。二、在Linux(CentOS)上部署MongoDB2.1......
  • Spring Boot应用MongoDB
    1.添加Maven依赖在SpringBoot项目中,引入spring-boot-starter-data-mongodb依赖:<dependencies><!--MongoDBstarterdependencyforSpringBoot--><dependency><groupId>org.springframework.boot</groupId><......
  • 456. 132 模式 Golang实现
    题目描述:给你一个整数数组nums,数组中共有n个整数。132模式的子序列由三个整数nums[i]、nums[j]和nums[k]组成,并同时满足:i<j<k和nums[i]<nums[k]<nums[j]。如果nums中存在132模式的子序列,返回true;否则,返回false。示例3:输入:nums=[-1,3,2,0]......
  • Vue项目在安装依赖时报错:this[kHandle] = new _Hash(algorithm, xofLen)
    原因:这个错误通常是由于Node.js版本更新导致的。新版本的Node.js包含了OpenSSL3.0,它对加密算法和密钥大小有更严格的限制,可能会影响一些旧项目。解决方案:临时解决(需要每次启动时设置):在VSCode终端中:$env:NODE_OPTIONS="--openssl-legacy-provider"在WindowsCMD......
  • Go 中修改切片副本的注意事项
    在Go编程中,切片是一种非常常用的数据结构。理解如何正确地修改切片中的元素非常重要,特别是当我们需要更改这些元素的值时。在这篇文章中,我们将探讨在切片中修改元素的不同方法,并讨论何时使用值切片和指针切片。1.使用值切片在Go中,使用值切片(例如[]wmsModel.OrderProduct)意......
  • Go 语言中的nil
    在Go语言中,nil是一个预定义标识符,表示“零值”或“空值”,主要用于引用类型(如指针、切片、映射、通道、接口等)。在Go中,引用类型变量在未赋值时的默认值为nil,表示该变量未指向任何有效的内存地址或资源。1.nil的使用场景nil可以用于以下几种数据类型:指针(Pointer):nil表......
  • Go语言内置集合的隐式指针
    在Go语言中,有几种内置集合类型(如slice、map和channel),这些类型的特殊之处在于它们实际上是隐式指针。这意味着当我们将这些集合类型传递给函数或方法时,传递的是它们的引用,而不是拷贝。这种特性使得这些集合能够在函数中直接修改原始数据,而不需要显式传递指针。1.内置集合......