go-redis学习笔记 | 青训营

118 阅读4分钟

Redis 是一个高性能的内存数据库,支持多种数据结构,每种数据结构都有其特定的用途和优势。下面是 Redis 中常用的数据结构:

  1. 字符串(String) :最基本的数据结构,可以存储字符串、整数、浮点数等。常用于缓存、计数器等场景。
  2. 哈希表(Hash) :类似于关联数组,可以存储字段和值的映射。常用于存储对象、记录的属性和值。
  3. 列表(List) :有序的字符串集合,可以在头部或尾部添加、删除元素。常用于实现消息队列、日志记录等。
  4. 集合(Set) :无序的字符串集合,不允许重复元素。常用于存储唯一值、标签、好友关系等。
  5. 有序集合(Sorted Set) :类似于集合,但每个元素都有一个分数,根据分数进行排序。常用于排行榜、优先队列等。
  6. 位图(Bitmap) :由二进制位组成的数据结构,支持位操作。常用于标记用户在线状态、统计等。
  7. 地理空间索引(Geo) :存储地理位置信息的数据结构,支持附近位置查询。常用于位置服务、附近人功能等。
  8. HyperLogLog:用于近似计数,可以估算不重复元素的个数。常用于统计独立 IP 访问数等。

每种数据结构在 Redis 中都有相应的命令可以操作,例如:

  • 字符串:SET key valueGET key
  • 哈希表:HSET hash key valueHGET hash key
  • 列表:LPUSH list valueLPOP list
  • 集合:SADD set memberSMEMBERS set
  • 有序集合:ZADD zset score memberZRANGE zset 0 -1
  • 位图:SETBIT bitmap offset valueGETBIT bitmap offset
  • 地理空间索引:GEOADD geoset longitude latitude memberGEORADIUS geoset longitude latitude radius m

使用不同的数据结构可以根据实际需求灵活地存储和操作数据,Redis 的数据结构特性使其在多种应用场景下都能发挥优势。无论是缓存、计数、搜索、排行榜还是实时分析等,Redis 都提供了丰富的数据结构和命令,方便开发者高效地处理不同类型的数据。

当涉及与 Redis 数据库进行交互时,Go-Redis 是一个强大且受欢迎的 Go 语言库。它提供了一系列功能丰富的方法来连接、操作和管理 Redis 数据库。本教程将深入介绍 Go-Redis 的使用,包括连接、基本操作、数据结构、事务、管道和连接池等方面。

安装 Go-Redis

首先,确保你已经安装了 Go 语言环境。然后,通过以下命令安装 Go-Redis:

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

连接到 Redis 服务器

在使用 Go-Redis 之前,你需要连接到 Redis 服务器。以下是一个连接示例:

package main

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

func main() {
	ctx := context.Background()

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

	pong, err := client.Ping(ctx).Result()
	if err != nil {
		fmt.Println("Failed to connect to Redis:", err)
		return
	}
	fmt.Println("Connected to Redis:", pong)
}

基本数据操作

设置键值对

err := client.Set(ctx, "name", "Alice", 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.Del(ctx, "name").Err()
if err != nil {
    fmt.Println("Failed to delete key:", err)
    return
}
fmt.Println("Key deleted")

数据结构操作

列表

向列表添加元素

err := client.LPush(ctx, "fruits", "apple", "banana", "cherry").Err()
if err != nil {
    fmt.Println("Failed to push to list:", err)
    return
}

获取列表长度

length, err := client.LLen(ctx, "fruits").Result()
if err != nil {
    fmt.Println("Failed to get list length:", err)
    return
}
fmt.Println("List length:", length)

获取列表元素

elements, err := client.LRange(ctx, "fruits", 0, -1).Result()
if err != nil {
    fmt.Println("Failed to get list elements:", err)
    return
}
fmt.Println("List elements:", elements)

事务操作

txCmds, err := client.TxPipeline().Exec(ctx, func(pipe redis.Pipeliner) error {
    pipe.Set(ctx, "counter", "0", 0)
    pipe.Incr(ctx, "counter")
    pipe.Incr(ctx, "counter")
    return nil
})
if err != nil {
    fmt.Println("Transaction failed:", err)
    return
}
for _, cmd := range txCmds {
    fmt.Println("Transaction result:", cmd)
}

管道操作

pipe := client.Pipeline()
pipe.Set(ctx, "fruit", "apple", 0)
pipe.Set(ctx, "color", "red", 0)
_, err := pipe.Exec(ctx)
if err != nil {
    fmt.Println("Pipeline failed:", err)
    return
}
fmt.Println("Pipeline completed")

连接池

client := redis.NewClient(&redis.Options{
    Addr:     "localhost:6379",
    DB:       0,
    PoolSize: 10, // 设置连接池大小
})

以上是 Go-Redis 的一些重要方法的使用示例。你可以根据实际需求,深入学习和掌握更多功能,如数据结构操作、发布订阅、连接池管理等。通过灵活运用 Go-Redis,你可以更轻松地与 Redis 数据库进行交互,实现高效的数据存储和检索。