go-redis 的使用 | 青训营笔记

58 阅读2分钟

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

redis 的安装

项目要用,我就简单地学一下吧,肯定是无法完全掌握的

redis 是数据库因为访问量过大而导致系统瘫痪时有程序员想出的缓存策略,本质就是一块存储键值对的内存空间,有丰富的经验来决策如何处理某个键值对,能够在大流量的情况下帮数据库抗住压力

(但是这个项目真的需要抗压吗?

$ pacman -S redis

redis 的使用

# 启动redis服务
$ sudo systemctl start redis
# 开机自启动redis服务
$ sudo systemctl enable redis
# 查看redis状态
$ systemctl status redis
# 进入cli交互模式
$ redis-cli
# ping一下redis服务是否启动
> ping
PONG
# 获取所有键名
> keys *
# 获取键的值
> get keyname
value

go-redis

go-redis 是一个开源依赖,用于 golang 和 redis 之间的交互

下面是最简单的 string 存储

package main

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

var client *redis.Client
var ctx context.Context

func init() {
	ctx = context.Background()
	client = redis.NewClient(&redis.Options{
		Addr: "127.0.0.1:6379",
		Password: "",
		DB: 0,
	})
}
func main() {
	a, err := client.Set(ctx, "name", "hello", 0).Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(a)
}

来看看 cli 交互结果

127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"hello"

完美,下面我们来看看取 string

func main() {
	//a, err := client.Set(ctx, "name", "hello", 0).Result()
	a, err := client.Get(ctx, "name").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(a)
}

命令行输出了 hello redis 有五大类型,分别是 String, Hash, List, Set, Sorted Set

上面只说了 String,肯定没法满足大部分日常需求,另外一个常用的类型就是 Hash,与 String 不同,Hash 的 key 对应的 value 是一张 Hash 表,相当于第二维度,第二个参数是 key,第三个参数是字段,第四个参数是对应的value

func main() {
	a, err := client.HSet(ctx, "int", "hello", 233).Result()
	b, err := client.HGet(ctx, "int", "hello").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(a)
	fmt.Println(b)
}

没错,你一定想到了这样 set 太慢了对吧,go-redis 还提供批量 HMSet 方法批量 set,和能获取全部元素的 HGetAll 方法

func main() {
	a, err := client.HMSet(ctx, "bigDataBase", map[string]interface{}{
		"name": "hello",
		"Password": "password",
		"luck": 8,
	}).Result()
	b, err := client.HGetAll(ctx, "int").Result()
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(a)
	fmt.Println(b)
}

但是注意,返回的是 map[string]string,所以实际使用中可能还需要取出来之后转换类型