redis 分布式锁
分布式锁的主要目的就是 在分布式系统中,多机部署并发场景下,保证一个方法在同一时间内只能被同一个线程执行。
下面是我用 .net core + csredis 简单实现的分布式锁。
1 IRedisClient redis = new RedisClient("192.168.199.145", 6379); 2 var styleNo = "styleNo"; 3 string[] keys = new string[1] { $"Goods:Stock:Lock:{styleNo}" }; 4 string[] argvs = new string[1] { Guid.NewGuid().ToString() }; 5 while (redis.Set(keys[0], argvs[0], 5, RedisExistence.Nx)!="OK")//如果不存在该键,写入该键值对,并设置过期时间,在同一个方法中判断设置,
保证获取锁操作的多个命令的原子性,防止并发多处获取到锁。 6 { 7 Thread.Sleep(50); 8 } 9 //业务逻辑 10 string script = "if redis.call('GET',KEYS[1])== ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end"; 11 redis.Eval(script, keys, argvs);//此处用lua脚本保证删除操作的原子性,只删除自己的锁。
用redis实现分布式锁,需要注意的几个问题:
1,获取锁时,一定要用 命令 “set key value ex 5 nx ”。
有人会用setnx先获取锁 ,然后expire去设置过期时间,这种情况如果程序在获取锁之后挂掉,没有设置上过期时间,就会导致死锁。
2,删除锁时,需要判断当前的锁是否是自己设置的锁,因为可能存在业务处理时间超时,自己的锁被释放,已经有其他的人获取到了锁,这个时候如果误删了他人的锁,
就会导致方法重入,出现数据错误等问题。
这里用到lua脚本保证删除操作的原子性。
3,如果redis挂掉了,业务就全部瘫痪了,所以要保证redis的高可用性。对于redis的高可用,我还没有太多的理解,暂时就不谈了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY