一、分布式锁背景

a、什么是锁?

从使用场景定义:当存在多个线程可以同时改变某个变量时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量。

锁的实现方式有多种,只要能满足所有线程都能看得到这个锁标记即可。

Java中常见的锁:
synchronized
ReentrantLock
ReentrantReadWriteLock

b、什么是分布式?

定义:分布式系统一定是由多个节点(计算机服务器)组成的系统,这些互通的节点上部署了各个服务,并且操作需要协同。

分布式系统对于终端用户而言,他们面对的就好像是一个服务器,提供用户需要的服务而已。

什么是CAP?

定义:任何一个分布式系统都无法同时满足一致性Consistency、可用性Availability、和分区容错性Partition Tolerance,最多只能同时满足两项。

因为单个服务器偶尔宕机不可避免(或者因为停电或者自然灾害导致单机房不可用),网络状况不稳定,时而会有网络抖动,时而延时比较高,所以必须满足P,所以一般会出现AP系统和CP系统。

c、a+b==》什么是分布式锁?

定义:在分布式环境下,一个共享的可见的公共资源,各个线程通过对这个公共资源的抢占,能够使得一个代码块在同一时间只能被一个机器的一个线程执行,那这个公共资源就是分布式锁,或者说这整个机制就是分布式锁。

或者从使用场景定义:分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性

二、分布式锁实现方式

锁的实现方式有多种,只要能满足所有线程都能看得到这个锁标记即可。

常见的方式是使用数据库缓存或者zookeeper来实现分布式锁,除了这些,其实一个网络中的共享可见的可读写的资源就可以用作实现锁。

锁的操作主要有两个,即lock()unlock()

4.分布式锁的特性

  • 这把锁要是一把可重入锁 (一般是指设置过期时间,避免死锁)
  • 这把锁最好是一把阻塞锁(阻塞锁是指不断循环请求获取锁资源,一般根据业务需求需不需要阻塞)
  • 有高可用的获取锁和释放锁的功能
  • 获取锁和释放锁的性能要好

三,分布式锁的应用场景

线程间并发问题和进程间并发问题都是可以通过分布式锁解决的,但是强烈不建议这样做!因为采用分布式锁解决这些小问题是非常消耗资源的!分布式锁应该用来解决分布式情况下的多进程并发问题才是最合适的

1.防止多个用户对数据进行修改,造成数据不准确(秒杀场景,修改库存信息)

样例:假设订单系统部署在两台机器上,不同的用户都要同时买 10 台 iPhone,分别发了一个请求给订单系统。接着每个订单系统实例都去数据库里查了一下,当前 iPhone 库存是 12 台。俩大兄弟一看,乐了,12 台库存大于了要买的 10 台数量啊!于是乎,每个订单系统实例都发送 SQL 到数据库里下单,然后扣减了 10 个库存,其中一个将库存从 12 台扣减为 2 台,另外一个将库存从 2 台扣减为 -8 台。现在完了,库存出现了负数!泪奔啊,没有 20 台 iPhone 发给两个用户啊!这可如何是好。

2.用户多次点击同一方法,产生重复数据 (重复订单,防止用户重复点击)

样例:有个投票的功能需求,每个人一天只能对自己比较满意的小视频投一次票,本来我三下五除二就写完了,觉得大事告吉.去测试环境测试也很OK,本以为就会想往常以后就没事了.结果线上进行投票时,后台监控某些用户同一天竟然投了两票或多票,这时我领导提醒我,可能是用户连续点击了两下投票按钮(尽管前端可以在点击第一次时就将按钮置灰,但是为了防止别人恶意调用接口,后台还是得坐相应的控制),导致请求并发了.而线上又是多个服务器,负载均衡将不同的请求分发到了不同的机器进行投票.所以这时需要用分布式锁去解决这个问题.现在假设该用户在n1这台服务器第一次去投票了,这时会根据用户ID和活动ID给该用户一把锁,而恰巧的是该用户在n2这台服务器第二次去投票了,因为这把锁给n1这台服务器的该用户给占用着,所以n2这台服务器的该用户只能等待着.等n1这台服务器的该用户进行了投票,而n2这台服务器的该用户会去看有没有投过票了,如果投过票了,就不会去投票了.如果不加分布式锁的话,多次请求又是同一时间间隔发的,可能会在多台机器上差不多时间执行,这时判断有没有投过票了,都会认会没投过票了,程序都会往下面一直走,直到成功,所以这就是一个用户一天可以投递多票的原因.

分布式锁的简介与作用相关推荐

  1. 缓存-分布式锁-Redisson简介整合

    Redisson分布式 GitHub中文文档 概念:是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提 ...

  2. Redis分布式锁的原理、作用及实现(简单易懂)

    转载地址:https://blog.csdn.net/d1562901685/article/details/54881862: setnx+getset方式  加锁:setnx(lock, 时间戳+ ...

  3. api 创建zookeeper客户端_zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  4. 关抢占 自旋锁_关于Redis分布式锁这一篇应该是讲的最好的了,先收藏起来再看!...

    作者:Nan,气冲天. 原文:https://blog.csdn.net/qq_44209336 前言 在Java并发编程中,我们通常使用到synchronized .Lock这两个线程锁,Java中 ...

  5. zookeeper分布式锁原理及实现

    前言 本文介绍下 zookeeper方式 实现分布式锁 原理简介 zookeeper实现分布式锁的原理就是多个节点同时在一个指定的节点下面创建临时会话顺序节点,谁创建的节点序号最小,谁就获得了锁,并且 ...

  6. 什么是分布式锁,分布式锁有什么作用?

    1 .什么是分布式锁 为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度.而这个分布式协调技术的核心就是来实现这个分布式锁. 2.为什么要使用分布式锁 成员变量 ...

  7. redis setnx 原子性_Redis从入门到深入-分布式锁(26)

    1. 分布式锁 1.1 简介 锁 是一种用来解决多个执行线程 访问共享资源 错误或数据不一致问题的工具 如果 把一台服务器比作一个房子,那么 线程就好比里面的住户,当他们想要共同访问一个共享资源,例如 ...

  8. 分布式锁选型背后的架构设计思维【附源码】

    1. 分布式锁本质 提到分布式锁,有很多实现,比如Redis分布式锁.ZooKeeper分布式锁.etcd分布式锁等.但是选择哪个更适合你的项目?在<基于CAP模型设计企业级真正高可用的分布式锁 ...

  9. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

最新文章

  1. SpockFS —— 基于 HTTP 的文件系统
  2. CSS选择器(转载)
  3. 产品中的实名认证该怎么设计?
  4. DPOS共识算法—缺失的白皮书
  5. 蚂蚁金服与阿里云宣布启动“蚂云计划”
  6. MarkDown语法, 快捷键,Dos命令
  7. -bash: xxxx.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
  8. libevent简述
  9. 64位 内存占用大 嵌入式_懵!面试官问我:Object o = new Object() 占用了多少个字节?...
  10. 参考平面及其高度_国家标准照度参考表
  11. html div 上下显示不全,div垂直居中 css div盒子上下垂直居中显示
  12. win8计算机无法安装打印机驱动程序,win8系统安装打印机驱动失败怎么办|win8系统安装打印机驱动失败的解决方法...
  13. 如何用ppt做自我介绍
  14. 如何在Excel中对工作表进行分组
  15. 科研写作——常见句式(二)
  16. Linux:udev机制详解
  17. C语言——关键字,define定义宏,指针,结构体
  18. 你的样子抖音版,架子鼓版
  19. 像程序员一样思考——程序员的四个境界
  20. 交互设计中的一些原则

热门文章

  1. Converting Phase Noise to Time Jitter
  2. css布局的基本思想,流行的CSS思想之——浅析OOCSS
  3. lopatkin俄大神精简Windows 10 Enterprise 19041.331 20H1 Release x86-x64 EN-RU PIP
  4. 连接字符串大全。。。
  5. 拉勾网职位数据爬取与分析(一)
  6. 背书小程序正式上线啦
  7. 下一代共识机制探究——基于DAG的BFT共识
  8. gitlab修改时区
  9. Windows Hook 易核心编程勾子基本理念
  10. linux 命令 ls