rueidis 简介

简介 rueidis 是一个快速的Golang Redis客户端,支持客户端缓存、Auto Pipelining、泛型OM、RedisJSON、RedisBloom、RediSearch等功能。 Features Auto pipelining for non-blocking redis commands RESP3 中的客户端缓存 Pub/Sub, Sharded Pub/Sub, Streams Redis Cluster, Sentinel, RedisJSON, RedisBloom, RediSearch, RedisTimeseries, 等. 具有客户端缓存和乐观锁定的通用对象映射 具有客户端缓存的分布式锁 rueidis mock OpenTelemetry 集成 Hooks and other 集成 提供类似 Go-redis API 的适配器 需要注意的是由于使用了一些go1.20版本才有的特性,如果想要使用低版本go,必须安装相应的版本。 简单使用 package main import ( "context" "fmt" "github.com/redis/rueidis" ) func main() { // 创建redis客户端连接 client, err := rueidis.NewClient(rueidis.ClientOption{InitAddress: []string{"127.0.0.1:6379"}}) if err != nil { panic(err) } defer client.Close() ctx := context.Background() // 执行 redis set 命令 err = client.Do(ctx, client.B().Set().Key("key1").Value("val").Nx().Build()).Error() if err != nil { panic(err) } hm, err := client.Do(ctx, client.B().Get().Key("key1").Build()).ToString() if err != nil { panic(err) } fmt.Println(hm) } go-redis适配器 如何快速从 go-redis 切换到 rueidis 客户端呢,rueidis 提供了rueidiscompat.NewAdapter 方法,通过Adapter可以使用熟悉的go-redis中的方法。 ...

七月 8, 2023 · overstarry

使用Redis实现消息队列

使用Redis实现消息队列主要有三种方法: List队列 发布/订阅模型 Pub/Sub Stream (Redis5+) 下面分别对这三种方法进行介绍,并编写简单例子。 List队列 看到队列,你会想到Redis有个数据类型List,List能很好符合队列的要求。List的底层是一个链表,在头部和尾部进行操作的时间复杂度都是O(1)。 使用List进行队列操作,你可以这样使用。 生产者使用LPUSH进行消息发布 消费者使用RPOP对消息进行消费 这里存在着一个问题,如果LIST没有消息时,消费者执行RPOP时,会返回null(nil)。 我们在编写消费者逻辑时,一般是循环不断从队列中消费数据进行处理,如果此时队列为空,那消费者依旧会频繁拉取消息,这会造成「CPU 空转」,不仅浪费 CPU 资源,还会对 Redis 造成压力。Redis提供了阻塞式拉起命令BRPOP / BLPOP,使用 BRPOP 这种阻塞式方式拉取消息时,还支持传入一个「超时时间」,如果设置为 0,则表示不设置超时,直到有新消息才返回,否则会在指定的超时时间后返回 null,既兼顾了效率还避免了CPU空转问题。 这是List队列的代码例子: // 生产者 package main import ( "context" "github.com/go-redis/redis/v8" ) func main() { rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 1, }) data :=[]string{`{"name": "jinzhu11221212321", "age": 18, "tags": ["tag211", "tag2"], "orgs": {"orga": "orga"}`,`{"name": "asd", "age": 18, "tags": ["tag211", "tag2"], "orgs": {"orga": "orga"}`} rdb.LPush(context.Background(), "queue", data) } // 消费者 package main import ( "context" "fmt" "log" "time" "github.com/go-redis/redis/v8" ) func main() { rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 1, }) for true { //result, err := rdb.RPop(context.Background(), "queue").Result() result, err := rdb.BRPop(context.Background(), 0, "queue").Result() if err == redis.Nil { continue } else if err != nil { log.Println(err) } fmt.Printf("consumer msg %v\n", result) } } List队列的缺点: ...

七月 7, 2021 · overstarry