我有一个类似于以下的场景:
txf := func(tx *redis.Tx) error {
// Phase 1:
// read some stuff by several get/hget request which I want to send with pipeline
// to avoid unnecessarily rounds to the redis server
// Phase 2: Prepare new data based on read data
// Phase 3: Write the new data with a transaction to use the watch protection if original keys changed
_, err = tx.Pipelined(func(pipe redis.Pipeliner) error {
// pipe handles the error case
pipe.Set(key, value, 0)
return nil})
return err
}
err := client.Watch(txf, key)
从阅读库代码看来, tx.TxPipeline 和 tx.Pipeline 在这种情况下都返回了一个 multi/exec 实现,这意味着如果我将它用于读取数据(阶段 1),我将在我用来更新数据的第二个管道。
任何解决方案都将得到应用。