在电商项目中,必定会与订单打交道。订单中必定会涉及到扣库存,但是在高并发项目中,库存余量不能及时刷新,导致库存扣除得不正确,1000个并发请求下来,扣除的库存只有几十个。如何解决此问题,那就得加锁了。还有其他解决办法也能处理此问题,本文只分享一下redis 分布式锁解决此问题。
第一步添加一个redis的获取锁,与释放锁的方法。在获取锁时,如果未获取到锁,那么就会尝试重复获取,直到获取倒锁后,才返回。当然在这步你可以加一个超时时间,例如最多尝试获取30秒,避免释放锁异常在此一直死循环。释放锁时只有锁的拥有者才能释放锁,避免锁被其他线程释放了,这个分布式锁就没有意义了。
public class RedisDistributedLock
{
private readonly ConnectionMultiplexer _redis;
private readonly IDatabase _database;
public RedisDistributedLock(ConnectionMultiplexer redis)
{
_redis = redis;
_database = redis.GetDatabase();
}
public async Task<bool> AcquireLockAsync(string lockKey, string value, TimeSpan lockTimeout)
{
var acquired = await _database.StringSetAsync(lockKey, value, lockTimeout, When.NotExists);
if (!acquired)
{