本系列都是翻译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来搭建可靠分布式锁的提议的更多相关文章

  1. Redis、Zookeeper实现分布式锁——原理与实践

    Redis与分布式锁的问题已经是老生常谈了,本文尝试总结一些Redis.Zookeeper实现分布式锁的常用方案,并提供一些比较好的实践思路(基于Java).不足之处,欢迎探讨. Redis分布式锁 ...

  2. 使用Redis SETNX 命令实现分布式锁

    基于setnx和getset http://blog.csdn.net/lihao21/article/details/49104695 使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其 ...

  3. go 利用orm简单实现接口分布式锁

    在开发中有些敏感接口,例如用户余额提现接口,需要考虑在并发情况下接口是否会发生问题.如果用户将自己的多条提现请求同时发送到服务器,代码能否扛得住呢?一旦没做锁,那么就真的会给用户多次提现,给公司带来损 ...

  4. Redis整合Spring实现分布式锁

    spring把专门的数据操作独立封装在spring-data系列中,spring-data-redis是对Redis的封装 <dependencies> <!-- 添加spring- ...

  5. 基于 Redis 实现简单的分布式锁

    摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...

  6. 基于Redis实现简单的分布式锁【理论】

    摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问.分布式锁实现的方案有很多 ...

  7. Redis 上实现的分布式锁

    转载Redis 上实现的分布式锁 由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多 ...

  8. 在 Redis 上实现的分布式锁

    由于近排很忙,忙各种事情,还有工作上的项目,已经超过一个月没写博客了,确实有点惭愧啊,没能每天或者至少每周坚持写一篇博客.这一个月里面接触到很多新知识,同时也遇到很多技术上的难点,在这我将对每一个有用 ...

  9. 使用Redis SETNX 命令实现分布式锁(转载)

    使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法. SETNX命令简介 命令格式 SETNX key value 将 key 的值设为 value,当且仅当 key 不存在. 若 ...

随机推荐

  1. JSON-SCHEMA

    这几天在写代码,和开发那边规范统一后,注释的JOSN需要写清楚schema, 于是学习了一下,国内的东西确实很少,看官网的英文文档也很蛋疼. 就把自己和看到的总结一下: http://json-sch ...

  2. 《BI项目笔记》创建多维数据集Cube(2)

    本节建立: 历年的初烟水分均值变化分析Cube:区域维度:地州,专县时间维度:年等级维度:大等级,小等级指标:水分均值 数据源视图: 数据处理: ) ) DELETE FROM T_QualMoist ...

  3. sublime_text3配置

    推荐视频 http://v.youku.com/v_show/id_XMzU5NzQ5ODgw.html 介绍的是2版本 准备工作 点击连接下载Sublime Text3 初始化用户信息 第一次安装该 ...

  4. PBcR - 纠错及组装算法

    单分子测序reads(PB)的混合纠错和denovo组装 我们广泛使用的PBcR的原始文章就是这一篇 原文链接:Hybrid error correction and de novo assembly ...

  5. iOS下载使用系统字体

    iOS下载使用系统字体 通用开发中一般使用系统默认的字体: 另外系统也提供了一些其他字体我们可以选择下载使用 1:在mac上打开 字体册 app 即可查找系统支持的字体,适用于ios上开发使用 从ma ...

  6. 鼠标滑过弹出jquery在线客服

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 不再折腾-----hadoop-1.2.1完全分布式安装

    准备工作 三台虚拟机,强烈推荐vmware + centos6.5 三台虚拟机均设有hadoop用户 IP地址设置 IP地址 hostname 192.168.11.100 master 192.16 ...

  8. (Python)导出指定文件夹中as文件的完全限定类名

    AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...

  9. 如何做出header,footer固定定位后让main主体部分可以滑动,在微信浏览器中滑动到最后不出现黑边的情况

    <!doctype html>   <html>   <head>   <meta charset="utf-8">   </ ...

  10. PDF 补丁丁 0.4.2.905 测试版发布:智能合并功能减小合并文件的大小

    之前的测试版在合并文件功能处添加两个相同的PDF文件,程序会重复写入该文件的内容,导致文件体积膨胀,浪费存储空间. 例如:使用者需要在原 PDF 文件(设文件为1.pdf)第2和第3页中间插入几张图片 ...