在使用.NET开发对接Redis的业务时,管道和事务是两个常用的功能,前者可以批量发送命令减少网络往返开销,后者可以保障一组命令的原子性执行。下面我们来看具体的实现方式。

核心概念说明
管道PipeLine是Redis客户端将多个命令一次性打包发送给服务端,服务端处理完所有命令后再统一返回结果,能够大幅减少网络IO次数,提升批量操作的效率。
事务Transactions是Redis通过MULTI、EXEC等命令实现的一组命令原子性执行,要么全部执行成功,要么全部不执行,同时支持通过WATCH命令实现乐观锁,避免并发修改带来的数据不一致问题。
准备工作
首先需要通过NuGet安装StackExchange.Redis包,然后创建Redis连接对象,后续的操作都基于这个连接对象展开。
// 安装StackExchange.Redis后,创建Redis连接
using StackExchange.Redis;
var redis = ConnectionMultiplexer.Connect("127.0.0.1:6379");
IDatabase db = redis.GetDatabase();管道PipeLine实现
StackExchange.Redis中可以通过创建批处理对象来实现管道功能,所有添加到批处理的命令会一次性发送到Redis服务端。
// 创建批处理对象,实现管道功能
var batch = db.CreateBatch();
// 添加多个命令到批处理,此时不会立即发送
var task1 = batch.StringSetAsync("pipe_key1", "value1");
var task2 = batch.StringSetAsync("pipe_key2", "value2");
var task3 = batch.StringGetAsync("pipe_key1");
// 执行批处理,所有命令一次性发送到Redis
batch.Execute();
// 等待所有任务完成,获取结果
Task.WaitAll(task1, task2, task3);
string result = task3.Result;
Console.WriteLine($"管道获取的结果:{result}");事务Transactions实现
事务实现需要先创建事务对象,添加要执行的命令,同时可以通过Condition添加乐观锁条件,最后执行事务。
// 创建事务对象
var transaction = db.CreateTransaction();
// 可选:添加乐观锁,监听指定key,如果该key在事务执行前被修改,事务会失败
transaction.AddCondition(Condition.KeyNotExists("trans_key1"));
// 添加事务要执行的命令
var setTask = transaction.StringSetAsync("trans_key1", "trans_value1");
var incrementTask = transaction.StringIncrementAsync("trans_key2");
// 执行事务,返回是否执行成功
bool success = transaction.Execute();
if (success)
{
Task.WaitAll(setTask, incrementTask);
Console.WriteLine("事务执行成功");
}
else
{
Console.WriteLine("事务执行失败,可能是监听的key被修改");
}注意事项
- 管道不具备原子性,只是批量发送命令,中间某个命令失败不会影响其他命令执行
- 事务中的命令在EXEC执行前不会真正执行,所以事务中添加的命令不能再依赖前面命令的结果
- 乐观锁的Condition如果不满足,整个事务会直接返回失败,不会执行任何命令
- 管道和事务都不建议一次性添加过多命令,避免阻塞Redis服务端
场景选择建议
如果只是需要批量执行多个不相关的Redis命令,优先选择管道提升性能;如果需要保障一组命令的原子性,或者需要避免并发修改带来的数据问题,就选择事务实现。
// 简单对比示例:不需要原子性用管道
var batch2 = db.CreateBatch();
batch2.StringSetAsync("test_pipe1", "1");
batch2.StringSetAsync("test_pipe2", "2");
batch2.Execute();
// 需要原子性用事务
var trans2 = db.CreateTransaction();
trans2.StringSetAsync("test_trans1", "1");
trans2.StringSetAsync("test_trans2", "2");
trans2.Execute();
Redis管道PipeLine事务Transactions.NET客户端StackExchange_Redis修改时间:2026-05-29 15:25:11