分布式锁
分布式的CAP理论告诉我们:任何一个分布式系统都无法同时满足一致性,分区容错性,可用性,最多只能同时满足两项。
分布式系统与单机系统的区别:
1.分布式系统不是多线程而是多进程。
2.多ianchengyouyu可以共享堆内存,因此可以简单的菜与内存作为标记存储位置;而进程之间可能都不在一台物理机上,因此需要将标记存储在一个所有进程都可见的地方。
线程锁:为了实现多个线程在同一时刻同一代码块只有一个线程可以执行,那么需要在某个地方做标记(堆内存),这个标记必须每个线程都能看见,当标记不存在时设置标记,后续线程发现已经有标记了则等待用有标记的线程,结束同步代码块取消标记后再尝试设置标记,这个标记可以理解为锁。
分布式锁实现方法
基于Redis做分布式锁 所用Redis方法setnx()、expire()
方法介绍: setnx(key,value) 方法是原子的 如果设置key不存在,则设置当前key成功,返回1;
如果当前key已经存在,则设置当前key失败,返回0。
expire() 设置过期时间,因为setnx命令不能设置key的超时时间,只能通过expire()来对key设置。
设置步骤: 1.setnx(lockkey,1)如果返回0,说明上锁失败,有线程在调用方法
2.expire()对lockkey设置超时时间,避免死锁。
3.执行完业务代码后,可以通过delete命令删除key
漏洞:上述方案在setnx执行成功后,expire执行成功前发生宕机的现象,依然会出现死锁方案。