专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C# 实现 分布式 集群 Redis加锁与解锁

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 0:43:37       共计:3611 浏览

Redis 加锁与解锁类,引用 using StackExchange.Redis;

/// <summary> /// redis分布式锁 /// 分布式锁四要素 /// 1、锁名 /// 2、加锁 /// 3、解锁 /// 4、锁超时时间 /// </summary> class RedisLock {//转载请保留 http://www.luofenming.com/show.aspx?id=ART2020070100001     // 1、redis连接管理类     private ConnectionMultiplexer connectionMultiplexer = null;       // 2、redis数据操作类     private IDatabase database = null;     public RedisLock()     {         connectionMultiplexer = ConnectionMultiplexer.Connect("localhost:6379");           database = connectionMultiplexer.GetDatabase(0);     }         /// <summary>     /// 加锁     /// 1、成功     /// 2、失败     /// </summary>     public bool Lock()     {         ///1、key 锁名         ///2、value 锁对象(谁锁的锁)         ///3、expire 锁过期时间(防死锁)         // 1、redis加锁         // 如何说加锁失败,怎么办?继续获取嘛         for (int i = 0; i < 10; i++)         {             bool flag = database.LockTake("redis_lock", Thread.CurrentThread.ManagedThreadId, TimeSpan.FromSeconds(10));               if (flag)             {                 return flag;             }               // 防止死循环导致内存溢出问题             Thread.Sleep(20);         }         return false;     }       /// <summary>     /// 解锁(释放锁占用资源)     /// </summary>     public bool Unlock()     {         // 1、redis解锁         bool flag =  database.LockRelease("redis_lock", Thread.CurrentThread.ManagedThreadId);           // 2、释放redis资源         connectionMultiplexer.Close();         return flag;     }   }

下面是调用加锁与解锁和一些业务操作

/// <summary> /// 秒杀方法 /// </summary> public void SkillProduct() {     RedisLock redisLock = new RedisLock();     if (redisLock.Lock())     {         // 1、获取商品库存         int productCount = 从数据库获取商品个数据            // 2、判断商品库存是否为空         if (productCount == 0)         {             // 2.1 秒杀失败消息             Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:不好意思,秒杀已结束");             redisLock.Unlock();             return;         }           // 3、秒杀成功消息         Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}:恭喜你,秒杀成功,商品编号:从数据库里面查询出来的编号");           // 4、扣减商品库存         productCount--;           redisLock.Unlock();     } }

版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:Redis从入门到精通(二)C#中使用redis及封装Redis工具类 | ·下一条:C#操作redis

Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有