using Fuel.Infrastructure.Extension;
using System;
namespace Fuel.Infrastructure
{
///
/// Redis实现锁帮助类
///
public class RedisLockerHelper
{
///
/// 获取redis分布式锁
///
///
/// 自动过期时间(毫秒)
///
public static bool GetRedisDistributedLock(string lockKeyName, long lockTimeout)
{
if (SetNx(lockKeyName, TimeExtension.GetNowTimeStamp(true) + lockTimeout, lockTimeout))
{
return true;
}
else
{
//未获取到锁,继续判断,判断时间戳看看是否可以重置并获取锁
long lockValue = RedisHelper.Get(lockKeyName);
long time = TimeExtension.GetNowTimeStamp(true);
if (time > lockValue)
{
//再次用当前时间戳getset
//返回固定key的旧值,旧值判断是否可以获取锁
long getsetResult = RedisHelper.GetSet(lockKeyName, time);
if (getsetResult == lockValue)
{
RedisHelper.Expire(lockKeyName, TimeSpan.FromMilliseconds(lockTimeout));
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
}
private static bool SetNx(string key, long time, double expireMS)
{
if (expireMS > 0)
{
if (RedisHelper.Set(key, time, TimeSpan.FromMilliseconds(expireMS), CSRedis.RedisExistence.Nx))
return true;
}
else
{
if (RedisHelper.SetNx(key, time))
{
RedisHelper.Expire(key, TimeSpan.FromMilliseconds(expireMS));
return true;
}
}
return false;
}
}
}