====== 分布式锁 ====== ===== 解决的问题 ===== 分布式锁是控制分布式系统之间同步访问共享资源的一种方式,需要互斥来防止彼此干扰来保证一致性。 ===== 场景一 ===== 分配任务场景:在这个场景中,由于是公司的业务后台系统,主要是用于审核人员的审核工作,并发量并不是很高,而且任务的分配规则设计成了通过审核人员每次主动的请求拉取,然后服务端从任务池中随机的选取任务进行分配。这个场景看到这里你会觉得比较单一,但是实际的分配过程中,由于涉及到了按用户聚类的问题,所以要比我描述的复杂,但是这里为了说明问题,大家可以把问题简单化理解。那么在使用过程中,主要是为了避免同一个任务同时被两个审核人员获取到的问题。 ===== 场景二 ===== 购买手机号码场景:提供给用户三个用于保护用户隐私的手机号码(这些号码是从运营商处获取的,和真实手机号码看起来是一样的),让用户选择其中一个进行购买,用户购买付款后,我需要将用户选择的号码分配给用户使用,同时也要将没有选择的释放掉。在这个过程中,给用户筛选的号码要在一定时间内(用户筛选正常时间范围内)让当前用户对这个产品具有独占性,以便保证付款后是100%可以拿到;同时由于产品资源池的资源有限,还要保持资源的流动性,即不能让资源长时间被某个用户占用着。 ===== 场景三 ===== 支付场景:一笔充值完成,银行前端和后端同时返回成功,对于同一笔交易,不能两次给用户加余额。 ===== 解决方案 ===== 常用的四种方案: - 基于数据库表做乐观锁,用于分布式锁。 - 使用memcached的add()方法,用于分布式锁。 - 使用redis的setnx()、expire()方法,用于分布式锁。 - 使用redis的setnx()、get()、getset()方法,用于分布式锁。 不常用但是可以用于技术方案探讨的: - 使用memcached的cas()方法,用于分布式锁。 - 使用redis的watch、multi、exec命令,用于分布式锁。 - 使用zookeeper,用于分布式锁。 参考:[[http://www.cnblogs.com/PurpleDream/p/5559352.html|分布式锁1 Java常用技术方案]]