go-redis 的使用
start at 2023/02/02.

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,所以实际使用中可能还需要取出来之后转换类型

我是真的不想学一堆工具,为什么要用一堆碎片一样的东西来构成项目,非常的不 suckless,如果能只完成简单的基础功能之后上线之后慢慢改东西来优化这个程序多好,非要在一开始就加大别人的学习成本,我希望的是学精,而不是学的杂和广,这样囫囵吞枣地学习一遍我觉得没有任何意义,虽然未来确实需要掌握这门技术,但是不想现阶段去掌握!

可能只是我的想法比较不同,我是一个喜欢造轮子的人,有些功能可以自己实现就很不想依靠别人的轮子,知道别人轮子的原理我也想自己造造看,只能说知音难寻,开源社区确实都是和我志同道合的人,但自己确实也没学会什么真本事,让别人尊重,无奈。现在感觉后端其实就是个拧螺丝的,掌握一堆工具之后,更加熟练地拧螺丝,有趣程度可能还不如前端(?

不过我承认,自己现在是把编程当作一门兴趣,但为的是以后的工作,当兴趣成为工作时,必然会让人沮丧,现在还是走一步看一步吧,无所谓,我会入钳教 😈

我到底想干什么呢,可能是写游戏吧,但是直觉告诉我,现在还没到那个时间

2.5 更新:

其实也就那样吧,能用起来之后还是挺开心的,又不是让我去学底层实现,我只需要会用他们提供给我的函数就行了,编程就这么回事,要说难度肯定是比不上算法的,学新东西没什么难的!

2023/02/05
> CLICK TO back <