go - 并发插入到Redis

标签 go concurrency redis

我有三个元素,分别由 100 万、200 万和 300 万个整数组成。我想将它们插入到 redis 中,以便它们同时发生并且总执行时间不大于 300 万个 int 的执行时间。我尝试使用 sync.Waitgroup 但它不会加快执行速度。这是我的基本代码。

package main

import (
    "log"
    "strconv"
    "time"

    "gopkg.in/redis.v5"
)

func main() {
    oneMillion := makeRange(1, 1000000)
    twoMillion := makeRange(1000001, 3000000)
    threeMillion := makeRange(3000001, 6000000)
    elements := [][]int{oneMillion, twoMillion, threeMillion}
    client := redis.NewClient(&redis.Options{
        Addr:         "localhost:6379",
        Password:     "",
        DB:           0,
        DialTimeout:  60 * time.Second,
        WriteTimeout: 60 * time.Second,
        ReadTimeout:  60 * time.Second,
        PoolTimeout:  60 * time.Second,
    })
    pipeline := client.Pipeline()
    for _, elem := range elements {
        for i := 0; i < len(elem); i++ {
            key := "KEY:" + strconv.Itoa(elem[i])
            val := "VAL:" + strconv.Itoa(elem[i])
            cmd := pipeline.Set(key, val, 0)
            if cmd.Err() != nil {
                log.Fatal("cmd error: ", cmd.Err())
            }
        }
        _, err := pipeline.Exec()
        if err != nil {
            log.Fatal("error: ", err)
        }
    }
}

func makeRange(min, max int) []int {
    a := make([]int, max-min+1)
    for i := range a {
        a[i] = min + i
    }
    return a
}

最佳答案

或多或少,redis 上的每个操作都是原子的,即在任何给定时间,redis 服务器上只会执行一个操作。因此理论上,如果您想在 Redis 服务器上执行 300 万个集合操作,所有这些操作都将连续发生。

关于go - 并发插入到Redis,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43962874/

相关文章:

java - 在 Java 中模拟多个客户端调用单个服务器类

emacs - 如何在后台执行自动完成查询?

node.js - 无法连接到 fakeredis 实例(Nodejs + Redis + Fakeredis)

lua - 在redis中加载lua脚本文件

go - golang的模板中如何多次使用parse

go - 初学者级别代码的死锁

go - golang 包中的 libpng

ssl - 简单的 GoLang SSL 示例

java - 使用 CompletableFuture 或 Future 对象获取 Callable 值

spring - Redis 还是 Ehcache?