以下使用 StackExchange.Redis 库中的 IConnectionMultiplexer 接口创建以订单 ID 为名称的互斥锁的示例代码,以防止重复退款操作:

using StackExchange.Redis;

// 创建 Redis 连接
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect('localhost');

// 获取一个名为 'order:{orderId}:refund' 的互斥锁
string orderId = '123';
string mutexKey = $'order:{orderId}:refund';
IDatabase db = redis.GetDatabase();
bool isMutexAcquired = db.LockTake(mutexKey, '1', TimeSpan.FromSeconds(10));

if (isMutexAcquired)
{
    try
    {
        // 在互斥期间执行退款操作
        RefundOrder(orderId);
    }
    finally
    {
        // 释放互斥锁
        db.LockRelease(mutexKey, '1');
    }
}
else
{
    // 互斥锁已被其他进程占用,退款操作被取消
    Console.WriteLine($'Failed to acquire mutex for {orderId}');
}

在上述代码中,我们首先使用 ConnectionMultiplexer 类创建了一个 Redis 连接,然后通过 GetDatabase 方法获取一个 IDatabase 实例,用于执行具体的 Redis 操作。

接着,我们根据订单 ID 构建了一个互斥锁的名称,即 'order:{orderId}:refund'。这个名称可以根据实际需求进行调整,只要能保证在同一时间只有一个进程能够占用即可。

然后,我们调用 IDatabase 的 LockTake 方法,尝试获取这个互斥锁。如果获取成功,则在 try 块中执行具体的退款操作;否则,我们认为互斥锁已被其他进程占用,退款操作被取消。

最后,在 finally 块中,我们调用 IDatabase 的 LockRelease 方法,释放互斥锁,以便其他进程能够占用。

C# Redis 互斥锁防止重复退款

原文地址: https://www.cveoy.top/t/topic/l2W8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录