美文网首页
golang redis事务 --- 2022-04-03

golang redis事务 --- 2022-04-03

作者: 一位先生_ | 来源:发表于2022-05-22 09:27 被阅读0次

    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")
    

    相关文章

      网友评论

          本文标题:golang redis事务 --- 2022-04-03

          本文链接:https://www.haomeiwen.com/subject/zfwfsrtx.html