一、使用场景

通常在分布式系统中,我们经常会从数据库中读取数据和修改数据,然而这不是一个原子操作,在并发时就会导致数据的不正确,例如一会下面的电商秒杀,库存数量的更新就会遇到。

二、实现锁的条件

1.互斥性:在任何时候,都有一个客户端持有锁

2.不能出现死锁:即在一个客户端持有锁的期间内,如果客户端出现故障也不能影响后续的客户端可以持有锁

3.保证上锁和解锁的是同一个客户端

三、具体实现

  1. 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
    }
    
  2. lua脚本

    if redis.call('setnx',KEYS[1],ARGV[1]) == 1 thenredis.call('expire',KEYS[1],ARGV[2])
    elsereturn 0
    end;
    
  3. 设置ttl

    SET key value [EX seconds] [PX milliseconds] [NX|XX]
    

    EX seconds:将键的过期时间设置为seconds秒。

    PX milliseconds:将键的过期时间设置为milliseconds毫秒。

    NX : 只在键不存在时, 才对键进行设置操作。

    XX : 只在键已经存在时, 才对键进行设置操作。

基于golang实现redis分布式锁相关推荐

  1. redis 分布式锁的实现方式

    情景如下: 我们有一批任务需要由多个分布式线程处理,每个任务都有一个taskId,为了保证每个任务只被执行一次,在工作线程执行任务之前,先获取该任务的锁,锁的key可以为taskId 方式1:set( ...

  2. redis分布式锁java代码_基于redis实现分布式锁

    " 在上一篇文章中介绍了动态配置定时任务,其中的原理跟spring 定时任务注解@Scheduled一样的,都是通过线程池和定义执行时间来控制.来思考一个问题,如果我们的定时任务在分布式微服 ...

  3. Java版基于Redis分布式锁的实现方式

    一.什么是分布式锁? 要介绍分布式锁,首先要提到分布式锁相对应的线程锁和进程锁, 线程锁:组要是给方法.代码块加锁,当方法或者代码块使用锁时,在同一时刻只有一个线程可以执行该方法或者代码块,线程锁只在 ...

  4. golang常用库之-操作redis go-redis/redis库、 go-redsync/redsync库(redis分布式锁)

    文章目录 golang常用库之-操作redis go-redis/redis库. go-redsync/redsync库(redis分布式锁) 一.什么是go-redis/redis库 go-redi ...

  5. redis分布式锁 在集群模式下如何实现_收藏慢慢看系列:简洁实用的Redis分布式锁用法...

    在微服务中很多情况下需要使用到分布式锁功能,而目前比较常见的方案是通过Redis来实现分布式锁,网上关于分布式锁的实现方式有很多,早期主要是基于Redisson等客户端,但在Spring Boot2. ...

  6. Redis分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6854573212831842311 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本篇文章主要是基于我们实际项目 ...

  7. Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 基于Redis使用分布式锁在当今已经不是什么新鲜事了. 本 ...

  8. 秒杀商品超卖事故:Redis分布式锁请慎用!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 来源:juejin.im/post/6854573 ...

  9. 记一次由Redis分布式锁造成的重大事故,避免以后踩坑!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:浪漫先生 juejin.im/post/5f159cd8f2 ...

最新文章

  1. python项目主界面_python项目案例
  2. 《深入浅出nodejs》读书笔记(3)
  3. 行,Python终于跌神坛了!程序员:活该!你敢来评论吗...
  4. session对象的使用
  5. Linux查ip出来的pp0,linux下使用shell查看apache IP访问量
  6. tensorflow 提示没有models库
  7. 数据挖掘算法-矩阵分解在推荐系统中的应用
  8. 帆软连接数据库的步骤
  9. python安装包下载
  10. 水系图一般在哪里找得到_水系电池再发Nature,事实力证或将迎来发展的春天!...
  11. 深度学习花书+机器学习西瓜书电子版我找到了
  12. 十进制转换成十二进制
  13. http://hi.baidu.com/%BE%C5%CC%EC%C4%A7%CA%DE/blog/item/9b3263626a75ff49ebf8f808.html
  14. iOS webp图片展示处理
  15. CTF—命令执行总结
  16. java fadein_原生JS实现 fadeIn / fadeOut 方法
  17. oracle请求http接口
  18. 实用工具(锐捷睿易篇)
  19. 基于Python库surprise的电影推荐系统
  20. vb.net 图形控件_玩转图形:VB.net GlassLabel控件

热门文章

  1. 使用foreach遍历对象
  2. linux 非root tomcat,Linux非root用户安装jdk和tomcat
  3. 【流放之路闪电打击开荒攻略】
  4. 沈师 数据库原理 PTA 填空题 无答案版
  5. 致远can盒添加id -baijiahao_ID.4 CROZZ补贴后价格不超过25万元,值得拥有! - 汽车时代...
  6. 中国重汽VGV首款乘用皮卡VX7——颜值与实力兼具
  7. 32-wait大变身之waitpid
  8. 【机器学习项目实战10例】(九):基于特征工程完成对贷款数据集Lending Club的预处理
  9. 最详细的解释——如何实现多张图片拼接为一张图(一)
  10. uniapp基于安卓平台动态展示static图片不显示问题解决方法