Redis介绍
Redis是一个开源的内存数据库。特点就是快。所以经常用来做数据库的缓存。当然它的用途不止这些。下面摘抄下李文周博客对redis用途的一些举例:
- 缓存系统,减轻主数据库(MySQL)的压力。
- 计数场景,比如微博、抖音中的关注数和粉丝数。
- 热门排行榜,需要排序的场景特别适合使用ZSET。
- 利用LIST可以实现队列的功能
Redis支持的数据结构中常用的是string、hash、lists、sets和sorted sets。 另外它还支持发布/订阅,以及stream。
除了单例模式,redis还有哨兵模式和集群模式。但是要注意,并不是所有的redis客户端都支持哨兵模式和集群模式。我之前用hiredis(这是一个c语言的库)的时候就被坑了一把。
golang里有很多redis客户端开源库,这里主要讲讲go-redis连接Redis数据库并进行操作。这个库支持哨兵模式和集群模式。
安装go-redis
$ go get -u github.com/go-redis/redis/v8
go: downloading github.com/go-redis/redis/v8 v8.11.3
go get: added github.com/go-redis/redis/v8 v8.11.3
订阅与发布的例子
go-redis的库里例子很丰富,我就用我用过的订阅发布来写个简单的小程序。
go.mod源码:
module HAHA
go 1.16
require (
github.com/cespare/xxhash/v2 v2.1.2 // indirect
github.com/go-redis/redis/v8 v8.11.3 // indirect
)
main.go源码
package main
import (
"context"
"fmt"
"time"
"github.com/go-redis/redis/v8"
)
func main() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379", // use default Addr
Password: "xxx",
DB: 0, // use default DB
PoolSize: 10,
})
pubsub := rdb.Subscribe(ctx, "mychannel1")
// 确认订阅已经闯将成功
_, err := pubsub.Receive(ctx)
if err != nil {
panic(err)
}
// 这个channel用于返回订阅的消息,缓存大小是100
// pubsub关闭的时候,channel也会关闭
ch := pubsub.Channel()
// 发布一个消息,用于自测
err = rdb.Publish(ctx, "mychannel1", "hello").Err()
if err != nil {
panic(err)
}
time.AfterFunc(time.Second, func() {
// When pubsub is closed channel is closed too.
_ = pubsub.Close()
})
// 消费消息
for msg := range ch {
fmt.Println(msg.Channel, msg.Payload)
}
}
编译
go build -o main main.go
参考资料
Go语言操作Redis
go-redis的github
|