随着互联网技术的飞速发展,分布式已经成为一个绕不开的话题,分布式环境下,“高并发访问共享资源”的场景并不少见,带来的问题也显⽽易见:共享资源在访问前后出现了数据不一致或非预期结果!!!
单体时代可以⽤JVM提供的ReentrantLock或者Synchronized解决,分布式环境下,JVM就有点力不不从心了。于是乎,“分布式锁”便出现了。
01 什么是分布式锁?
在计算机科学中,锁(lock)与互斥(mutex)是一种同步机制,用于在许多线程执行时对资源的限制。
分布式锁可以理解为,控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。
1、分布式锁应具备哪些特性?
分布式锁是多服务共享锁,在分布式的部署环境下,通过锁机制来让客户端互斥的对共享资源进行访问,应该具备以下特性。
**互斥性:**同一时间,保证共享资源只能被一个客户端的一个线程能访问,具有排他性。
**防死锁:**锁在一段时间后,一定会被释放(正常释放或异常释放)。
**高可用:**获取锁的机制必须高可用,性能佳。
**阻塞锁(可选):**当前资源已被加锁,其他客户端或者线程是阻塞等待,还是立即返回。
**可重入(可选):**当前锁的持有者是否能再次进入。
**公平性(可选):**加锁的顺序和请求加锁的顺序是一致,还是随机抢锁。
2、分布式锁可以解决哪些场景的问题?
分布式锁就是用来解决高并发访问导致数据不一致的问题,这里列举几种常见的场景。
**多用户修改数据,造成数据不准确:**多个请求对同一条数据同时进行修改,导致数据不准确。比如“下单减库存”、“互联网秒杀”、“抢红包”、“抢票”、“抢优惠券”、“互联网选号”、“转账”等。
**多次请求,数据重复:**请求结果暂未返回时,进行多次操作或重试,产生多个相同的请求,不加锁的情况下成功,会产生很多重复记录。
**分布式协调:**分布式环境下ÿ