Redis 与go结合 | 青训营

52 阅读2分钟

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 提供了持久化机制。

  1. RDB(Redis Database Dump)将内存数据定期快照写入磁盘,适用于数据备份与迁移,但可能导致少量数据丢失。
  2. AOF(Append-Only File)持久化记录每个写操作,保障数据完整性,但文件相对较大。混合模式结合两者优势,折衷了性能和数据完整性。
  3. 持久化机制可根据需求配置,帮助在内存数据库中保留重要数据,并在服务器重启后恢复。然而,持久化会增加磁盘 I/O 和空间占用,需要根据业务需求和资源限制进行权衡