基于golang实现redis分布式锁
一、使用场景
通常在分布式系统中,我们经常会从数据库中读取数据和修改数据,然而这不是一个原子操作,在并发时就会导致数据的不正确,例如一会下面的电商秒杀,库存数量的更新就会遇到。
二、实现锁的条件
1.互斥性:在任何时候,都有一个客户端持有锁
2.不能出现死锁:即在一个客户端持有锁的期间内,如果客户端出现故障也不能影响后续的客户端可以持有锁
3.保证上锁和解锁的是同一个客户端
三、具体实现
setnx+expire (加锁)
setnx k1 value1 expire 5 seconds #成功返回1,在键k1不存在的时候将key的值设置为value1 setnx k1 value2 expire 5 seconds #失败返回0,因为k1已经存在值value1了,相当于已经有客户端吃锁了,设置失败 del k1 #删除k1的值,成功返回1,这里的del相当于释放锁 setnx k1 value2 expire 5 seconds #成功,返回1
type orderService struct {orderRepository repository.OrderRepositorygoodsService service.IGoodsServiceredis *redis.Client }func (s *orderService) tryLock(userId, goodsId, lockId int64) (err error) {var res bool//Redis Setnx命令在指定的 key 不存在时,为 key 设置指定的值(key存在了不能覆盖)if res, err = s.redis.SetNX(service.Ctx, fmt.Sprintf("lock:%d:%d", userId, goodsId), lockId, time.Minute).Result(); err != nil {log.Printf("redis.SetNx() failed, err: %v", err)err = code.RedisErrreturn}if !res {err = code.MiaoshaFailed}return }
lua脚本
if redis.call('setnx',KEYS[1],ARGV[1]) == 1 thenredis.call('expire',KEYS[1],ARGV[2]) elsereturn 0 end;
设置ttl
SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX seconds:将键的过期时间设置为seconds秒。
PX milliseconds:将键的过期时间设置为milliseconds毫秒。
NX : 只在键不存在时, 才对键进行设置操作。
XX : 只在键已经存在时, 才对键进行设置操作。
基于golang实现redis分布式锁相关推荐
- redis 分布式锁的实现方式
情景如下: 我们有一批任务需要由多个分布式线程处理,每个任务都有一个taskId,为了保证每个任务只被执行一次,在工作线程执行任务之前,先获取该任务的锁,锁的key可以为taskId 方式1:set( ...
- redis分布式锁java代码_基于redis实现分布式锁
" 在上一篇文章中介绍了动态配置定时任务,其中的原理跟spring 定时任务注解@Scheduled一样的,都是通过线程池和定义执行时间来控制.来思考一个问题,如果我们的定时任务在分布式微服 ...
- Java版基于Redis分布式锁的实现方式
一.什么是分布式锁? 要介绍分布式锁,首先要提到分布式锁相对应的线程锁和进程锁, 线程锁:组要是给方法.代码块加锁,当方法或者代码块使用锁时,在同一时刻只有一个线程可以执行该方法或者代码块,线程锁只在 ...
- golang常用库之-操作redis go-redis/redis库、 go-redsync/redsync库(redis分布式锁)
文章目录 golang常用库之-操作redis go-redis/redis库. go-redsync/redsync库(redis分布式锁) 一.什么是go-redis/redis库 go-redi ...
- redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...
在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...
- Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6854573212831842311 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目 ...
- Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本 ...
- 秒杀商品超卖事故:Redis分布式锁请慎用!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...
- 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...
最新文章
- python项目主界面_python项目案例
- 《深入浅出nodejs》读书笔记(3)
- 行,Python终于跌神坛了!程序员:活该!你敢来评论吗...
- session对象的使用
- Linux查ip出来的pp0,linux下使用shell查看apache IP访问量
- tensorflow 提示没有models库
- 数据挖掘算法-矩阵分解在推荐系统中的应用
- 帆软连接数据库的步骤
- python安装包下载
- 水系图一般在哪里找得到_水系电池再发Nature,事实力证或将迎来发展的春天!...
- 深度学习花书+机器学习西瓜书电子版我找到了
- 十进制转换成十二进制
- http://hi.baidu.com/%BE%C5%CC%EC%C4%A7%CA%DE/blog/item/9b3263626a75ff49ebf8f808.html
- iOS webp图片展示处理
- CTF—命令执行总结
- java fadein_原生JS实现 fadeIn / fadeOut 方法
- oracle请求http接口
- 实用工具(锐捷睿易篇)
- 基于Python库surprise的电影推荐系统
- vb.net 图形控件_玩转图形:VB.net GlassLabel控件
热门文章
- 使用foreach遍历对象
- linux 非root tomcat,Linux非root用户安装jdk和tomcat
- 【流放之路闪电打击开荒攻略】
- 沈师 数据库原理 PTA 填空题 无答案版
- 致远can盒添加id -baijiahao_ID.4 CROZZ补贴后价格不超过25万元,值得拥有! - 汽车时代...
- 中国重汽VGV首款乘用皮卡VX7——颜值与实力兼具
- 32-wait大变身之waitpid
- 【机器学习项目实战10例】(九):基于特征工程完成对贷款数据集Lending Club的预处理
- 最详细的解释——如何实现多张图片拼接为一张图(一)
- uniapp基于安卓平台动态展示static图片不显示问题解决方法