您的位置:首页 > 数据库 > Redis

使用redis实现分布式锁,可以解决集群中需要单例的情况

2014-12-02 14:17 453 查看

//获取分布式锁

public static bool EnterLock(string lockName, int seconds)

{

BasicRedisClientManager basicRedisClientManager = new BasicRedisClientManager(ConfigurationManager.AppSettings["RedisServerIP"].ToString());

using (var redisClient = basicRedisClientManager.GetClient())

{

if (redisClient.ContainsKey(lockName))

{

return false;

}

else

{

DateTime expired = DateTime.Now.AddSeconds(seconds);

redisClient.Add(lockName, "1", expired);

return true;

}

}

}

//释放分布式锁

public static void ExitLock(String lockName)

{

BasicRedisClientManager basicRedisClientManager = new BasicRedisClientManager(ConfigurationManager.AppSettings["RedisServerIP"].ToString());

using (var redisClient = basicRedisClientManager.GetClient())

{

redisClient.Delete(lockName);

}

}

public void TestRedisLock()

{

string lockName = "lockTest";

if (EnterLock(lockName, 10))

{

//执行获得分布式Lock的操作

ExitLock(lockName);

}

}

==============================

BasicRedisClientManager basicRedisClientManager = new BasicRedisClientManager(ConfigurationManager.AppSettings["RedisServerIP"].ToString());

using (IRedisClient RClient = basicRedisClientManager.GetClient())

{

if (!RClient.ContainsKey("key"))

{

using (IRedisTransaction IRT = RClient.CreateTransaction())

{

IRT.QueueCommand(r => { if (r.ContainsKey("key")) { r.Add("key", 1); } });

IRT.Commit(); // 提交事务

}

}

}

public static bool EnterLock(string lockName, int seconds)

{

BasicRedisClientManager basicRedisClientManager = new BasicRedisClientManager(ConfigurationManager.AppSettings["RedisServerIP"].ToString());

using (var redisClient = basicRedisClientManager.GetClient())

{

if (!redisClient.ContainsKey(lockName))

{

using (redisClient.AcquireLock(lockName + "_redisLock"))

{

if (!redisClient.ContainsKey(lockName))

{

DateTime expired = DateTime.Now.AddSeconds(seconds);

redisClient.Add(lockName, "1", expired);

return true;

}

}

}

return false;

}

}

=======================

using (redisClient.AcquireLock("_redisLock")){//逻辑}

redisClient.AcquireLock("testlock", TimeSpan.FromSeconds(10));{}

public static void TestRedisLock()

{

string lockName = "zhq_lock";

if (EnterLock(lockName, 100))

{

//执行获得分布式Lock的操作

//创建data

Console.Write("lockName");

ExitLock(lockName);

}

else

{

while (true)

{

//try

Thread.Sleep(1000);

if (EnterLock(lockName, 100))

{

TestRedisLock();

}

}

}

}

lock=wait+ single



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐