Golang Go语言中 [求助] go-redis, 如何将 pipeline 传入函数

发布于 1周前 作者 itying888 来自 Go语言

Golang Go语言中 [求助] go-redis, 如何将 pipeline 传入函数

issues #1164 遇到的问题一样

我的目的

将 pipeline 传入其他函数后,还能正常使用 redis 命令

func main() {
        client := redis.NewClient(&redis.Options{
		Addr:     "127.0.0.1:6379",
		Password: "", 
		DB:       0, 
	})
    pipe := client.Pipeline()       // 1. 现在 pipe 的类型是 Pipeliner interface
    pipe.Hset("yo", "key", "test")  // 2. 在这里可以正常使用 redis 命令
    test(&pipe)
    pipe.Exec()
}

func test(pipe *redis.Pipeliner) { pipe.HSet(“yo”, “key”, “test”) // 3. 在这里就不行了, 现在的 pipe 一个 method 都没有 }

已经尝试过的方法

因为 redis.Pipeline type 可以直接使用 redis 命令,

redis.Pipeline 的补全.png

所以尝试 cast Interface

func test(pipe *redis.Pipeliner) {
    p := pipe.(*redis.Pipeline) // IDE 提示 invalid type assertion, (no interface-type *redis.Pipeline on left) 
}


更多关于Golang Go语言中 [求助] go-redis, 如何将 pipeline 传入函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

Pipeliner 是 interface 啊,你加*做什么…

更多关于Golang Go语言中 [求助] go-redis, 如何将 pipeline 传入函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


老哥强啊,不加 * 就可以了

😳抱歉,犯蠢了,刚学 golang 不久

#1
interface 为什么不能加*?
求解
我也是刚学 go

我感受到 github 对面传来的一股哀怨 /捂脸

Pipeliner 传递过来的 interface 是指针,在对他取址,就找不到方法了

func (c *Client) Pipeline() Pipeliner {
pipe := Pipeline{
ctx: c.ctx,
exec: c.processPipeline,
}
pipe.init()
return &pipe
}

在Go语言中,使用go-redis库进行Redis操作时,Pipeline 是一个非常有用的特性,它可以让你批量执行Redis命令,从而提高性能。如果你想将Pipeline传入函数,可以按照以下步骤进行:

  1. 导入必要的包: 确保你已经导入了go-redis/v8(或其他版本)包。

  2. 创建Redis客户端: 使用redis.NewClient函数创建一个Redis客户端实例。

  3. 创建Pipeline: 使用客户端的Pipeline方法创建一个Pipeline实例。

  4. 定义函数: 定义一个接收redis.Pipeliner接口作为参数的函数。这允许你传递任何实现了该接口的Pipeline实例。

  5. 在函数中使用Pipeline: 在函数内部,你可以像使用普通客户端一样使用Pipeline实例执行命令。

  6. 执行Pipeline: 在函数外部,调用Pipeline的Exec方法以执行所有排队的命令。

下面是一个简单的示例代码:

package main

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

func processPipeline(ctx context.Context, pipe redis.Pipeliner) {
    pipe.Set(ctx, "key", "value", 0)
}

func main() {
    rdb := redis.NewClient(&redis.Options{})
    ctx := context.Background()
    pipe := rdb.Pipeline()
    processPipeline(ctx, pipe)
    cmds, err := pipe.Exec(ctx)
    if err != nil {
        fmt.Println(err)
    }
    // 处理cmds结果
}

这样,你就可以将Pipeline实例传入函数并在其中执行Redis命令了。

回到顶部