业务调用(我们使用多线程模拟多用户秒杀的场景)
//业务:悲观锁方式 public static void PessimisticLock() { int num = 10; //总数量 string lockkey = "xianseng"; Console.WriteLine("我是【悲观锁】"); //悲观锁开启20个人同时拿宝贝 for (int i = 0; i < 20; i++) { Task.Run(() => { string selfmark = ""; try { if (Lock(lockkey, out selfmark)) { if (num > 0) { num--; Console.WriteLine($"我拿到了宝贝:宝贝剩余{num}个\t\t{selfmark}"); } else { Console.WriteLine("宝贝已经没有了"); } Thread.Sleep(100); } } finally { UnLock(lockkey, selfmark); } }); } Console.ReadLine(); } //业务:乐观锁方式 public static void OptimisticLock() { int num = 10; //总数量 string lockkey = "xianseng"; Console.WriteLine("我是【乐观锁】"); //乐观锁开启10个线程,每个线程拿5次 for (int i = 0; i < 10; i++) { var lineOn = "线程" + (i + 1); Task.Run(() => { for (int j = 0; j < 5; j++) { string selfmark = ""; try { if (Lock(lockkey, out selfmark, 10, 0)) { if (num > 0) { num--; Console.WriteLine($"{lineOn} 第{(j+1)}次 我拿到了宝贝:宝贝剩余{num}个\t\t{selfmark}"); } else { Console.WriteLine($"{lineOn} 第{(j + 1)}次 宝贝已经没有了"); } Thread.Sleep(1000); } else { Console.WriteLine($"{lineOn} 第{(j+1)}次 没有拿到,不想等了"); } } finally { UnLock(lockkey, selfmark); } } }); } Console.ReadLine(); }
然后在main函数里面调用查看展示效果
static void Main(string[] args) { ////调用:悲观锁方式(认为我操作的时候,会出现问题,所以都加锁) PessimisticLock(); ///调用:乐观锁方式(认为什么时候不会出问题,所以不上锁,更新的时候去查询判断一下,再此期间是否有人修改过这个数据。) //OptimisticLock(); }
这就简单实现了Redis分布锁的功能,快去试试吧。
参考文献
- Redis如何实现分布式锁:https://www.cnblogs.com/laohanshuibi/p/15164807.html
- 浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted ):https://www.cnblogs.com/xiongze520/p/10267804.html
- 几分钟搞定redis存储session共享——设计实现:https://www.cnblogs.com/xiongze520/p/10333233.html