[翻译]利用REDIS来搭建可靠分布式锁的提议
本系列都是翻译REDIS作者的博文 另外加上我自己的一点点理解 希望有问题大家一起讨论
http://antirez.com/news/77 原文地址
在利用REDIS做分布式锁时基本持有2种观点: 1种认为这是非常 快速的 很伟大的案例 认为redis解决了一个非常难解决的问题,但是另一方面却不是这样的观点,认为利用REDIS做分布式锁是非常恼火的,完全是在错误的使用REDIS
作者认为2者都正确 也就是作者认为2者都说的过去 那我们来看看作者是怎么阐述的:
Safety and Liveness guarantees
作者提出了3点要求 对于一个可靠的分布式锁服务系统:
1) 安全属性: 锁竞争 任何时候 只有一个锁能够提供服务
2) Liveness A:无死锁发生 即使可能有一个客户端锁住一个资源崩溃了或者被隔离了 最终系统还是能够获得锁
3) Liveness B: 错误容忍 只要主Redis上线 客户端就能够取得和释放锁。
Why failover based implementations are not enough
一般而言 实现的模式如下:
if redis.get(resource)==false set resource_name random_value px 3000 do_something() if(redis.get(resource)==true) redis.del(resource)
利用REDIS来实现一种带有时间阀值的KEY 来保证了条款2的不会出问题
但是3是无法满足的。 如果REDIS master 挂掉 了 怎么办 这点很恼火:
没有办法满足服务哦 了解REDIS都知道 REDIS还是推出了异步的主从服务机制,也就是说redis本身而言 master挂了 还可以调用从节点 但是注意这里是异步 也就是不安全,可能会导致在传给slave之前主机down掉 那就悲催 这样之后调用从机节点就没法保证了 怪不得了作者准备新加一个WAIT命令来做同步复制功能 这个功能的确需要~! 不扯这里了 看看在现有的环境下作者又会给出什么算法呢?
1) 为了防止Key 被其他客户端删除掉 作者提出了一个想法 就是key相同 value 采用signal的方法 value采用一个随机值【对于每个客户端而言】
if redis.call("get",KEYS[]) == ARGV[] then
return redis.call("del",KEYS[])
else
return
end
对于Client 1 本身有一个ARGV[1] 如果相等 才删除。这种很好的避免了被其他客户端删除这个key。
但是前面提出的那个问题主从问题还是不能很好的解决掉。 如果主节点挂掉 从节点上去之后 没有那个KEY 下面是我写的一个伪代码部分 仅供参考
伪代码如下:
Thread
task_have_done true
if redis.getLock(key)==true
do_Task()
set task_have_done true
else
sleep()
try_get_lock() Thread if Keepalive_Master()==true
{
if task_have_done true
redis.unlock(key)
continue;
}
else
change_Master
if task_have_done && redis.get(key)==myValue
del key
if redis.get(key)==NULL
SET KEY my_value px_last_time
后面作者提出了在分布式环境下的REDIS 获取分布式锁问题 这点留到以后分析 因为我的感觉锁这个东西占用不了很大的空间 所以目前估计还用不着 嘿嘿
这就是目前REDIS的一个分布式锁解决的问题。
[翻译]利用REDIS来搭建可靠分布式锁的提议的更多相关文章
- Redis、Zookeeper实现分布式锁——原理与实践
Redis与分布式锁的问题已经是老生常谈了,本文尝试总结一些Redis.Zookeeper实现分布式锁的常用方案,并提供一些比较好的实践思路(基于Java).不足之处,欢迎探讨. Redis分布式锁 ...
- 使用Redis SETNX 命令实现分布式锁
基于setnx和getset http://blog.csdn.net/lihao21/article/details/49104695 使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其 ...
- go 利用orm简单实现接口分布式锁
在开发中有些敏感接口,例如用户余额提现接口,需要考虑在并发情况下接口是否会发生问题.如果用户将自己的多条提现请求同时发送到服务器,代码能否扛得住呢?一旦没做锁,那么就真的会给用户多次提现,给公司带来损 ...
- Redis整合Spring实现分布式锁
spring把专门的数据操作独立封装在spring-data系列中,spring-data-redis是对Redis的封装 <dependencies> <!-- 添加spring- ...
- 基于 Redis 实现简单的分布式锁
摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...
- 基于Redis实现简单的分布式锁【理论】
摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...
- Redis 上实现的分布式锁
转载Redis 上实现的分布式锁 由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多 ...
- 在 Redis 上实现的分布式锁
由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多技术上的难点,在这我将对每一个有用 ...
- 使用Redis SETNX 命令实现分布式锁(转载)
使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若 ...
随机推荐
- mysql show status
在LAMP架构的网站开发过程中,有些时候我们需要了解MySQL的服务器状态信息,譬如当前MySQL启动后的运行时间,当前MySQL的客户端会话连接数,当前MySQL服务器执行的慢查询数,当前MySQL ...
- [转载]win32 计时器使用
在工业生产控制系统中,有许多需要定时完成的操作,如定时显示当前时间,定时刷新屏幕上的进度条,上位机定时向下位机发送命令和传送数据等.特别是在对控制性能要求较高的实时控制系统和数据采集系统中,就更需要精 ...
- End Routine
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Codeforces Round #316 (Div. 2) D. Tree Requests dfs序
D. Tree Requests time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- nodejs 访问mysql
安装 $ npm install mysql 简介 这个一个mysql的nodejs版本的驱动,是用JavaScript来编写的.不需要编译 这儿有个例子来示范如何使用: var mysql = re ...
- runtime运行机制方法学习
runtime这玩意第一次听说时都不知道是什么,经过了解后才知道它就是oc动态语言的机制,没有它那oc就不能称为动态语言.在之前可能大家对runtime了解都不深,随着编程技能的日益加深和需要,大家开 ...
- 使用celery之深入celery配置(转)
原文:http://www.dongwm.com/archives/shi-yong-celeryzhi-shen-ru-celerypei-zhi/ 前言 celery的官方文档其实相对还是写的很不 ...
- java.lang.OutOfMemoryError: PermGen space异常处理(内存溢出)
楼主刚接触到这个问题,问度娘,直接查到的都是让 在tomcat>bin>catalina.sh文件的“echo "Using CATALINA_BASE: $CATALINA_B ...
- iOS开发 Apple Pay
一.什么是Apple Pay? 1. 概念 Apple Pay,简单来说, 就是一种移动支付方式.通过Touch ID/ Passcode,用户可使用存储在iPhone 6, 6p等设备上的信用卡和借 ...
- 浅谈 Android 自定义锁屏页的发车姿势
作者:blowUp,原文链接:http://mp.weixin.qq.com/s?__biz=MzA3NTYzODYzMg==&mid=2653577446&idx=2&sn= ...