redis事务可以一次执行多个命令, 并且带有以下两个重要的保证:

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
下面介绍golang redis事务用法。

go redis事务常用函数:

TxPipeline - 以Pipeline的方式操作事务
Watch - redis乐观锁支持
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.watch
redis乐观锁支持,可以通过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")