前言
为什么互联网资讯这么发达,但是没有出现技术人才井喷?
为什么会出现应届生薪资倒挂多年老员工的现象?
这个世界有太多的现象都可以用**“二八定律”**来解释。
20%拿着高工资,80%每天挣扎在增删改查边缘。
职场一分钱一分货
人家拿高薪,不是全靠运气
工作年限越久,不代表越值钱
一年经验用了五年,无法改变
因为经历不等于经验
加班“重灾区”的互联网行业以996闻名,每天超过11小时的工作时长每年位居各行业之首。
工作内容重复,加班导致学习时间不够,无法跟上技术更新脚本。
如何花最少时间学习最多知识,迫在眉睫!
如何打破程序员提升的三大屏障,成为符合互联网行业的JAVA高级工程师。
一、背景
我们日常在电商网站购物时经常会遇到一些高并发的场景,例如电商 App 上经常出现的秒杀活动、限量优惠券抢购,还有我们去哪儿网的火车票抢票系统等,这些场景有一个共同特点就是访问量激增,虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,为了避免并发问题,防止库存超卖,给用户提供一个良好的购物体验,这些系统中都会用到锁的机制。
对于单进程的并发场景,可以使用编程语言及相应的类库提供的锁,如 Java 中的 synchronized 语法以及 ReentrantLock 类等,避免并发问题。
如果在分布式场景中,实现不同客户端的线程对代码和资源的同步访问,保证在多线程下处理共享数据的安全性,就需要用到分布式锁技术。
那么何为分布式锁呢?分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰保证一致性。
一个相对安全的分布式锁,一般需要具备以下特征:
- 互斥性。互斥是锁的基本特征,同一时刻锁只能被一个线程持有,执行临界区操作。
- 超时释放。通过超时释放,可以避免死锁,防止不必要的线程等待和资源浪费,类似于 MySQL 的 InnoDB 引擎中的 innodblockwait_timeout 参数配置。
- 可重入性。一个线程在持有锁的情况可以对其再次请求加锁,防止锁在线程执行完临界区操作之前释放。
- 高性能和高可用。加锁和释放锁的过程性能开销要尽可能的低,同时也要保证高可用,防止分布式锁意外失效。
可以看出实现分布式锁,并不是锁住资源就可以了,还需要满足一些额外的特征,避免出现死锁、锁失效等问题。
二、分布式锁的实现方式
目前实现分布式锁的方式有很多,常见的主要有:
- Memcached 分布式锁
利用 Memcached 的 add 命令。此命令是原子性操作,只有在 key 不存在的情况下,