Redis介绍
Redis是一款高性能的开源内存数据库,具有快速的读写能力和多样化的数据结构。它将数据存储在内存中,因此具有出色的访问速度,适用于需要高速数据访问的场景。Redis支持字符串、哈希、列表、集合等多种数据结构,使开发者能够灵活地处理各种数据类型。此外,Redis还提供数据持久化、发布-订阅、事务操作等功能,以满足各种应用需求
GO 与Redis相结合举例
package main
import (
"context"
"fmt"
"time"
"github.com/go-redis/redis/v8"
)
func main() {
// 创建 Redis 客户端实例
client := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // Redis 服务器地址
Password: "", // 密码
DB: 0, // 使用的数据库编号
})
// 创建上下文
ctx := context.Background()
// Ping Redis 服务器
pong, err := client.Ping(ctx).Result()
if err != nil {
fmt.Println("Failed to ping Redis:", err)
return
}
fmt.Println("Ping response:", pong)
// 设置键值对
err = client.Set(ctx, "myKey", "Hello, Redis!", 0).Err()
if err != nil {
fmt.Println("Failed to set key:", err)
return
}
// 获取键对应的值
val, err := client.Get(ctx, "myKey").Result()
if err != nil {
fmt.Println("Failed to get key:", err)
return
}
fmt.Println("Value for myKey:", val)
// 设置带有过期时间的键值对
err = client.Set(ctx, "myExpKey", "I will expire", 10*time.Second).Err()
if err != nil {
fmt.Println("Failed to set expiring key:", err)
return
}
time.Sleep(5 * time.Second) // 等待 5 秒钟
// 获取过期键的值
expVal, err := client.Get(ctx, "myExpKey").Result()
if err == redis.Nil {
fmt.Println("Key myExpKey does not exist")
} else if err != nil {
fmt.Println("Failed to get expiring key:", err)
} else {
fmt.Println("Value for myExpKey:", expVal)
}
// 关闭连接
if err := client.Close(); err != nil {
fmt.Println("Failed to close Redis client:", err)
}
}
创建了一个 Redis 客户端实例,连接到本地 Redis 服务器。然后设置键值对、获取键对应的值,以及设置带有过期时间的键值对。
Redis的数据使用
这包括字符串、哈希、列表等等。
// ==== 示例:字符串操作 ====
err := client.Set(ctx, "name", "John", 0).Err()
if err != nil {
fmt.Println("Failed to set key:", err)
return
}
name, err := client.Get(ctx, "name").Result()
if err != nil {
fmt.Println("Failed to get key:", err)
return
}
fmt.Println("Name:", name)
// ==== 示例:哈希操作 ====
err = client.HSet(ctx, "user:1", "name", "Alice").Err()
if err != nil {
fmt.Println("Failed to set hash field:", err)
return
}
age, err := client.HGet(ctx, "user:1", "age").Result()
if err != nil {
fmt.Println("Failed to get hash field:", err)
return
}
fmt.Println("User Age:", age)
// ==== 示例:列表操作 ====
err = client.RPush(ctx, "tasks", "task1", "task2", "task3").Err()
if err != nil {
fmt.Println("Failed to push to list:", err)
return
}
tasks, err := client.LRange(ctx, "tasks", 0, -1).Result()
if err != nil {
fmt.Println("Failed to get list elements:", err)
return
}
fmt.Println("Tasks:", tasks)
Redis持久化介绍
为了解决内存数据库在宕机后数据丢失的问题,Redis 提供了持久化机制。
- RDB(Redis Database Dump)将内存数据定期快照写入磁盘,适用于数据备份与迁移,但可能导致少量数据丢失。
- AOF(Append-Only File)持久化记录每个写操作,保障数据完整性,但文件相对较大。混合模式结合两者优势,折衷了性能和数据完整性。
- 持久化机制可根据需求配置,帮助在内存数据库中保留重要数据,并在服务器重启后恢复。然而,持久化会增加磁盘 I/O 和空间占用,需要根据业务需求和资源限制进行权衡