首页 » 网站推广 » phpmemcache代码锁技巧_除了rediszk数据库你还会设计分布式锁吗

phpmemcache代码锁技巧_除了rediszk数据库你还会设计分布式锁吗

访客 2024-11-01 0

扫一扫用手机浏览

文章目录 [+]

mysql:通过表的行锁来实现分布式锁

redis:通过redis供应的set nx px命令,来实现分布式锁

phpmemcache代码锁技巧_除了rediszk数据库你还会设计分布式锁吗

zookeeper:通过zookeeper供应的临时有序节点,来实现分布式锁

phpmemcache代码锁技巧_除了rediszk数据库你还会设计分布式锁吗
(图片来自网络侵删)

除了常见的三种分布式锁,还有其他办法吗

在考虑用其他办法实现的根本下,我们先理解下锁的事理:

锁的目的是当有线程利用特定资源的时候,担保其他线程不能操作被锁的资源,即排他性,因此分布式锁的核心事理便是在不同主机(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命令来实现分布式锁,有兴趣的可以研究一下

相关文章

招商蛇口中国房地产龙头企业,未来可期

招商蛇口(股票代码:001979),作为中国房地产企业的领军企业,自成立以来始终秉持“以人为本,追求卓越”的经营理念,致力于打造高...

网站推广 2025-02-18 阅读1 评论0