更新时间: 2023-07-18 10:32:16#golang redis事务redis事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 下面介绍golang redis事务用法。 go redis事务常用函数: TxPipeline - 以Pipeline的方式操作事务 Watch - redis乐观锁支持 Pipeline - pipeline #1.TxPipeline以Pipeline的方式操作事务 // 开启一个TxPipeline事务 pipe := client.TxPipeline() // 执行事务操作,可以通过pipe读写redis incr := pipe.Incr("tx_pipeline_counter") pipe.Expire("tx_pipeline_counter", time.Hour) // 上面代码等同于执行下面redis命令 // // MULTI // INCR pipeline_counter // EXPIRE pipeline_counts 3600 // EXEC // 通过Exec函数提交redis事务 _, err := pipe.Exec() // 提交事务后,我们可以查询事务操作的结果 // 前面执行Incr函数,在没有执行exec函数之前,实际上还没开始运行。 fmt.Println(incr.Val(), err) #2.watchredis乐观锁支持,可以通过watch监听一些Key, 如果这些key的值没有被其他人改变的话,才可以提交事务。 // 定义一个回调函数,用于处理事务逻辑 fn := func(tx *redis.Tx) error { // 先查询下当前watch监听的key的值 v, err := tx.Get("key").Result() if err != nil && err != redis.Nil { return err } // 这里可以处理业务 fmt.Println(v) // 如果key的值没有改变的话,Pipelined函数才会调用成功 _, err = tx.Pipelined(func(pipe redis.Pipeliner) error { // 在这里给key设置最新值 pipe.Set("key", "new value", 0) return nil }) return err } // 使用Watch监听一些Key, 同时绑定一个回调函数fn, 监听Key后的逻辑写在fn这个回调函数里面 // 如果想监听多个key,可以这么写:client.Watch(fn, "key1", "key2", "key3") client.Watch(fn, "key")