Redis 自学习记录丨青训营笔记

78 阅读3分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 15 天

本文同步发布于博客(xblc.netlify.app),如果有更新博客会在第一时间更新


tags: [知识点记录, GoLang, 青训营]


一些基础理解

简单来说Redis就是经常和MySQL一起使用的一种不用复杂查询语句的简单数据库,运行在内存中,速度很快

可以参考阅读: 为什么要用Redis?Redis为什么这么快? - 知乎

使用一贯就是一个软件的使用上手过程,尝试一下就好了,关键是一些基础概念的理解

使用好 help 指令 + 学会优先查文档可以解决大部分问题

如果不设置 Redis-Server 自启动的话,后台运行指令为 redis-server --daemonize yes

数据类型

Key

key的范围非常广泛,可以是图片也可以是空字符串

  • 不建议用非常长的key,一方面对内存不友好,另一方面影响比较时间、查询性能,如果实在需要很长建议先hash一下
  • 太短也不行,要表达出意思。
  • .- 一般用于表示多字段,固定一个习惯比较好

String

非常基本的数据类型

  • 如果是数字甚至可以用来自增

键空间操作命令

一些命令可以很好的对各种键的空间进行控制,他们不属于任何类型

键过期时间

  • 可以控制秒或毫秒精度,但后者更常用
  • 键过期时间会持久到硬盘中继续虚拟流逝
  • 没有过期时间会返回-1,不存在键返回-2

其他类型

  • Set 集合
  • Zset 有序集合
  • Hash 散列表
  • List 列表

简单使用

一个简单的在 Go 中使用的例子


package main

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

func main() {
	// create a Redis client
	rdb := redis.NewClient(&redis.Options{
		Addr:     "localhost:6379",
		Password: "",
		DB:       0,
	})
        
            // Ping the Redis server to check if it's running
        _, err := client.Ping(context.Background()).Result()
        if err != nil {
            panic(err)
        }


	// set a key-value pair
	err := rdb.Set(context.Background(), "mykey", "myvalue", 0).Err()
	if err != nil {
		panic(err)
	}

	// get the value of a key
	val, err := rdb.Get(context.Background(), "mykey").Result()
	if err != nil {
		panic(err)
	}
	fmt.Println("mykey", val)
}


简单解释就是连接 Redis 服务器并且简单使用了一下这个运行在内存中的数据库。其中 context.Background() 就类似于占位符,可以暂时不用管。

理解了这个例子以后,主要就是理解它和一般的本地关系数据库的不一样了

image.png

这是一个简单说明,理解还不太透彻,也不用太在意

然后是一个简单具体的例子,考虑一个场景:

需要你为一款电商软件设计后端,假设这款电商软件经常有抢购活动

  • 用户需要频繁进行加购和取消购物车操作
  • 需要存储的数据也不复杂,好像不用关系数据表也可以

这个时候我们尝试使用 Redis 来实现这个过程,主要运用了 List 数据类型

首先是加购操作

func addToCart(client *redis.Client, userID string, itemID string) error {
    // Add the item ID to the user's shopping cart
    key := "cart:" + userID
    err := client.RPush(context.Background(), key, itemID).Err()
    if err != nil {
        return err
    }
    return nil
}

这里主要用到了 List 的数据结构,我们可以左右push和pop

然后是获取和移除

func getCart(client *redis.Client, userID string) ([]string, error) {
    // Retrieve the user's shopping cart
    key := "cart:" + userID
    items, err := client.LRange(context.Background(), key, 0, -1).Result()
    if err != nil {
        return nil, err
    }
    return items, nil
}

LRange 函数可以将左边一个范围的元素取出来,代码里这种取法表示取左边第一个

func removeFromCart(client *redis.Client, userID string, itemID string) error {
    // Remove the item ID from the user's shopping cart
    key := "cart:" + userID
    err := client.LRem(context.Background(), key, 0, itemID).Err()
    if err != nil {
        return err
    }
    return nil
}

LRem 用来移除