在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。在单机环境中,Java中其实提供了很多并发处理相关的API,例如:ReentrantLock
与synchronized
等,
但是这些API在分布式场景中就无能为力了。也就是说单纯的Java API并不能提供分布式锁的能力。所以针对分布式锁的实现目前有多种方案。
下面我们主要说使用Redisson(Redis开源框架)分布式锁和同步器做分布式锁,当然你也可以直接使用Redis操作,例如lua脚本,保证一致性。
单锁
1 | /** |
联锁
1 | public RedissonMultiLock lock(long times, Set<String> keys) throws TimeoutException { |
完整代码
1 | package com.alone.common.lock; |
不管锁分布式锁还是Java API的各种锁,只要用了锁则会损耗一定的性能作为代价,所以要在需要的地方使用。