mysql:通过表的行锁来实现分布式锁
redis:通过redis供应的set nx px命令,来实现分布式锁
zookeeper:通过zookeeper供应的临时有序节点,来实现分布式锁

除了常见的三种分布式锁,还有其他办法吗
在考虑用其他办法实现的根本下,我们先理解下锁的事理:
锁的目的是当有线程利用特定资源的时候,担保其他线程不能操作被锁的资源,即排他性,因此分布式锁的核心事理便是在不同主机(JVM),通过一个共享资源来标记锁的得到与否,担保其他线程访问被锁的资源时互斥。
之前干货君利用mongodb实现过一个分布式锁:精通分布式锁?那用mongodb实现一个吧
下面我们在理解事理的情形下,我们基本可以用很多第三方运用来实现,下面我们用memcache来实现一个分布式锁
memcache分布式锁把稳:Memcache是这个项目的名称,而memcached是它做事器真个主程序文件名,很多人傻傻分不清。
安装memcached做事就不描述了,大家可以自行查询,下面紧张先容下memcache:
Memcached是一个自由开源的,高性能,分布式内存工具缓存系统。它与redis的差异紧张表示在如下几个方面:
redis支持的数据构造类型较多,memcached紧张存储字符串和工具redis集群通过hash槽实现,memcached通过同等性hashmemcached不支持持久化,redis可以持久化那么我们实现分布式锁紧张利用memcached以下几个命令:
add 命令:用于将 value(数据值) 存储在指定的 key(键) 中。如果 add 的 key 已经存在,则不会更新数据,之前的值将仍旧保持相同,并且您将得到相应 NOT_STORED。get 命令:获取存储在 key(键) 中的 value(数据值) ,如果 key 不存在,则返回空。delete 命令:用于删除已存在的 key(键)。
下面我们用Java代码实现一下
引入依赖
<dependency> <groupId>spy</groupId> <artifactId>memcached</artifactId> <version>2.4rc1</version></dependency>
Java实现
public class MemcacheLock implements DistributedLock{ public static MemcachedClient memcachedClient; static { try { memcachedClient = new MemcachedClient(new InetSocketAddress(11211)); } catch (IOException e) { e.printStackTrace(); } } @Override public boolean lock(String key, String requestId) { // 如果key存在则失落败,否则添加成功 Future<Boolean> add = memcachedClient.add(key, 100,requestId); try { Boolean result = add.get(); return result; } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return false; } @Override public boolean unlock(String key, String requestId) { // 获取key的值 Object o = memcachedClient.get(key); // 判断requestId是不是相等 if (requestId.equals(o)){ // 删除key Future<Boolean> delete = memcachedClient.delete(key); try { return delete.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } return false; }}
实在memcached还可以利用cas命令来实现分布式锁,有兴趣的可以研究一下