30天学会Go--第7天 GO语言 Redis 学习与实践
文章目录
- [30天学会Go--第7天 GO语言 Redis 学习与实践](#30天学会Go--第7天 GO语言 Redis 学习与实践)
-
- 前言
- [一、Redis 基础知识](#一、Redis 基础知识)
-
- [1.1 Redis 的核心特性](#1.1 Redis 的核心特性)
- [1.2 Redis 常见使用场景](#1.2 Redis 常见使用场景)
- [二、安装 Redis](#二、安装 Redis)
-
- [2.1 在 Linux 上安装](#2.1 在 Linux 上安装)
- [2.2 在 Windows 上安装](#2.2 在 Windows 上安装)
- [2.3 使用 Docker 安装 Redis](#2.3 使用 Docker 安装 Redis)
- [三、Redis 常用命令](#三、Redis 常用命令)
-
- [3.1 基本操作](#3.1 基本操作)
- [3.2 数据结构操作](#3.2 数据结构操作)
-
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- [有序集合(Sorted Set)](#有序集合(Sorted Set))
- [四、在 Go 中使用 Redis](#四、在 Go 中使用 Redis)
-
- [4.1 安装 go-redis](#4.1 安装 go-redis)
- [4.2 使用示例](#4.2 使用示例)
- [4.3 代码解读](#4.3 代码解读)
- [五、Redis 高级功能](#五、Redis 高级功能)
- 六、总结
前言
Redis 是一个高性能的开源内存数据库,常用于缓存、消息队列、会话存储等场景。它支持多种数据结构(如字符串、哈希、列表、集合、有序集合等)和丰富的操作命令,具有极高的性能和灵活性。
以下是 Redis 的基础知识、安装、常用命令,以及在 Go 中使用 Redis 的方法。
go语言官方编程指南:https://pkg.go.dev/stdopen in new window
go语言的官方文档学习笔记很全,推荐去官网学习
30天学会Go--第7天 GO语言 Redis 学习与实践(改):30天学会Go--第7天 GO语言 Redis 学习与实践(改)
本章讲redis有所欠缺,请移步新的blog
30天学会Go--第6天 GO语言 RESTful API 学习与实践:30天学会Go--第6天 GO语言 RESTful API 学习与实践-CSDN博客
一、Redis 基础知识
1.1 Redis 的核心特性
- 内存存储:所有数据存储在内存中,读写速度极快。
- 多种数据结构:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等。
- 持久化:支持将内存数据持久化到磁盘(RDB 和 AOF 两种方式)。
- 高可用:支持主从复制、哨兵模式和集群模式,提供高可用性和扩展性。
- 丰富的功能:如发布/订阅(Pub/Sub)、事务、Lua 脚本等。
1.2 Redis 常见使用场景
- 缓存:将经常访问的数据存储到 Redis 中,提高读取性能。
- 会话存储:存储用户登录状态等会话信息。
- 排行榜:利用有序集合(Sorted Set)实现排行榜功能。
- 消息队列:使用列表(List)或发布/订阅功能实现消息队列。
- 分布式锁:利用 Redis 的原子操作实现分布式锁。
二、安装 Redis
2.1 在 Linux 上安装
-
下载 Redis:
bashwget http://download.redis.io/redis-stable.tar.gz
-
解压并编译:
bashtar xzf redis-stable.tar.gz cd redis-stable make
-
启动 Redis:
bashsrc/redis-server
2.2 在 Windows 上安装
- 下载 Redis for Windows:
- Redis 官方不支持 Windows,但可以下载社区版:https://github.com/microsoftarchive/redis/releases
- 解压后运行
redis-server.exe
启动服务。
2.3 使用 Docker 安装 Redis
-
拉取 Redis 镜像:
bashdocker pull redis
-
启动 Redis 容器:
bashdocker run -d --name redis -p 6379:6379 redis
三、Redis 常用命令
3.1 基本操作
-
连接 Redis:
bashredis-cli
-
设置键值对:
bashSET key value
-
获取键值:
bashGET key
-
删除键:
bashDEL key
-
检查键是否存在:
bashEXISTS key
-
设置过期时间(秒):
bashEXPIRE key seconds
-
查看剩余过期时间:
bashTTL key
3.2 数据结构操作
字符串(String)
-
增加值(适用于数值类型):
bashINCR key INCRBY key increment DECR key DECRBY key decrement
哈希(Hash)
-
设置哈希字段 :
bashHSET key field value
-
获取哈希字段值 :
bashHGET key field
-
获取所有字段和值 :
bashHGETALL key
列表(List)
-
从左插入元素:
bashLPUSH key value1 value2
-
从右插入元素:
bashRPUSH key value1 value2
-
获取列表范围内的元素:
bashLRANGE key start stop
-
弹出最左边的元素:
bashLPOP key
集合(Set)
-
添加元素到集合 :
bashSADD key member1 member2
-
获取集合中的所有元素 :
bashSMEMBERS key
-
检查元素是否存在 :
bashSISMEMBER key member
有序集合(Sorted Set)
-
添加元素并设置分数 :
bashZADD key score1 member1 score2 member2
-
获取有序集合中的元素 :
bashZRANGE key start stop WITHSCORES
四、在 Go 中使用 Redis
在 Go 中使用 Redis,通常使用第三方库 go-redis。
4.1 安装 go-redis
运行以下命令安装:
bash
go get github.com/redis/go-redis/v9
4.2 使用示例
以下是一个简单的示例,展示如何在 Go 中使用 Redis。
代码示例
go
package main
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
var ctx = context.Background()
func main() {
// 1. 连接到 Redis
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 地址
Password: "", // 如果没有设置密码,留空
DB: 0, // 使用默认数据库
})
// 2. 写入数据
err := rdb.Set(ctx, "key", "value", 0).Err()
if err != nil {
panic(err)
}
// 3. 读取数据
val, err := rdb.Get(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key:", val)
// 4. 检查键是否存在
exists, err := rdb.Exists(ctx, "key").Result()
if err != nil {
panic(err)
}
fmt.Println("key exists:", exists)
// 5. 删除键
err = rdb.Del(ctx, "key").Err()
if err != nil {
panic(err)
}
fmt.Println("key deleted")
}
4.3 代码解读
-
连接 Redis:
- 使用
redis.NewClient
创建 Redis 客户端。 - 配置地址、密码和数据库编号。
- 使用
-
写入数据:
- 使用
Set
方法写入键值对。 - 第三个参数为过期时间,
0
表示不过期。
- 使用
-
读取数据:
- 使用
Get
方法读取键的值。
- 使用
-
检查键是否存在:
- 使用
Exists
方法检查键是否存在。
- 使用
-
删除键:
- 使用
Del
方法删除键。
- 使用
五、Redis 高级功能
5.1 发布/订阅(Pub/Sub)
Redis 支持发布/订阅模式,可以实现消息广播。
代码示例
go
// 发布消息
rdb.Publish(ctx, "channel1", "Hello, Redis!").Err()
// 订阅消息
sub := rdb.Subscribe(ctx, "channel1")
ch := sub.Channel()
for msg := range ch {
fmt.Println("Received message:", msg.Payload)
}
5.2 使用 Redis 实现分布式锁
Redis 的原子操作可以用来实现分布式锁。
代码示例
go
// 加锁
ok, err := rdb.SetNX(ctx, "lock_key", "lock_value", 10*time.Second).Result()
if err != nil || !ok {
fmt.Println("Failed to acquire lock")
return
}
// 执行业务逻辑
fmt.Println("Lock acquired, executing task...")
// 解锁
rdb.Del(ctx, "lock_key")
六、总结
Redis 是一个功能强大且灵活的内存数据库,在 Go 中使用 Redis 非常简单。通过学习 Redis 的基本命令和在 Go 中的集成,你可以轻松实现缓存、消息队列、分布式锁等功能。