当事务在redis中执行时,其他客户端不会被阻塞吗?

yvfmudvl  于 2023-03-07  发布在  Redis
关注(0)|答案(1)|浏览(304)

代码:

func main() {
    ctx := context.Background()
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // no password set
        DB:       0,  // use default DB
    })
    pipe := rdb.TxPipeline()
    for i := 0; i < 10000; i++ {
        pipe.Set(ctx, "a", "abc", time.Second)
    }
    fmt.Println("Start")
    pipe.Exec(ctx)
    fmt.Println("End")
}

当控制台打印Start时,表示事务已经开始执行,然后我尝试在shell中连接到redis并执行get命令,为什么命令没有被阻塞(此时End还没有被打印),这正常吗?因为事务中的命令还没有执行

127.0.0.1:6379> get a
(nil)
127.0.0.1:6379>
rjee0c15

rjee0c151#

这是正常的,在Redis上启动一个事务不会锁定服务器上的任何东西,当你调用EXEC时,所有排队的命令都会自动执行。
唯一提供的锁定是使用WATCH命令,如果修改了任何WATCHed键,该命令将使事务失败。
您可以阅读更多关于Redis交易here的信息。

相关问题