You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Golang中redis-json的Pipeline支持实现方案咨询

解决方案:批量插入JSON对象的Pipeline实现方案

一、基于redis-json(go-rejson/v4)实现Pipeline

go-rejson/v4底层依赖go-redis客户端,而go-redis原生支持Pipeline操作,因此可以借助这一能力批量执行JSON.SET命令:

  1. 核心实现代码
import (
    "context"
    "github.com/nitishm/go-rejson/v4"
    "github.com/go-redis/redis/v8"
)

func batchInsertJSON() {
    ctx := context.Background()
    // 初始化redis客户端
    rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})
    // 基于redis客户端创建rejson实例
    jsonClient := rejson.NewReJSONClientFromGoRedisClient(rdb)

    // 创建Pipeline
    pipe := rdb.Pipeline()

    // 待插入的JSON数据列表
    dataList := []map[string]interface{}{
        {"id": "user:1", "name": "Alice", "age": 28},
        {"id": "user:2", "name": "Bob", "age": 32},
    }

    // 批量将JSON.SET命令加入Pipeline
    for _, data := range dataList {
        key := data["id"].(string)
        // 用rejson的Cmd方法构造JSON.SET命令,加入Pipeline执行队列
        cmd := jsonClient.Cmd(ctx, "JSON.SET", key, "$", data)
        pipe.Process(ctx, cmd)
    }

    // 执行批量命令
    _, err := pipe.Exec(ctx)
    if err != nil {
        // 按需处理错误,比如打印日志或重试
        panic(err)
    }
}
  1. 关键说明
  • 无需开启事务,Pipeline会将所有命令一次性发送到Redis,减少网络往返开销
  • 可以通过pipe.Exec()返回的结果列表,逐个检查单条命令的执行状态
  • 确保插入的Key唯一,避免覆盖已有数据

二、替代方案:直接使用go-redis执行批量JSON命令

如果不想依赖go-rejson,也可以直接用go-redis的Pipeline执行原生JSON.SET命令,代码更简洁:

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

func batchInsertWithGoRedis() {
    ctx := context.Background()
    rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})
    pipe := rdb.Pipeline()

    dataList := []map[string]interface{}{
        {"id": "user:3", "name": "Charlie", "age": 25},
        {"id": "user:4", "name": "David", "age": 35},
    }

    for _, data := range dataList {
        key := data["id"].(string)
        jsonBytes, _ := json.Marshal(data)
        // 直接调用Do方法添加JSON.SET命令到Pipeline
        pipe.Do(ctx, "JSON.SET", key, "$", jsonBytes)
    }

    _, err := pipe.Exec(ctx)
    if err != nil {
        panic(err)
    }
}

三、与Redis-Search的兼容性说明

批量插入完成后,可正常使用Redis-Search客户端为这些JSON数据创建索引。建议提前定义好索引结构,确保JSON数据的字段匹配索引规则,Pipeline操作不会影响索引的建立与查询。

内容的提问来源于stack exchange,提问作者nadavtsa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:48:29