如何用redis实现分布式锁

标签: redis 分布式锁 | 发表时间:2014-11-12 23:26 | 作者:flysharkym
出处:http://blog.csdn.net

引子

redis作为一个强大的key/value数据库,其实还可以用来实现轻量级的分布式锁。


1.实现方案1

最早官方在 SETNX命令页给了一个实现:

  acquire lock: SETNX lock.foo <current Unix time + lock timeout + 1>
  release lock: DEL lock.foo
  acquire lock when time expired: GETSET lock.foo <current Unix timestamp + lock timeout + 1>


不过这个方案有漏洞,就是release lock用的DEL命令不支持cas删除(delete if current value equals old value),这样忽略race condition将会出现问题:

A client will try to release the lock after the expire time deleting the key created by another client that acquired the lock later.


2.实现方案2

官方在 SETNX命令页介绍了新的方案:SET command + Lua script:

Starting with Redis 2.6.12 it is possible to create a much simpler locking primitive using the  SET command to acquire the lock, and a simple Lua script to release the lock. The pattern is documented in the  SET command page.

The old  SETNX based pattern is documented below for historical reasons.


该方案有2个优化:

(1)SET 命令可以设置key过期时间:SET key value [EX seconds] [PX milliseconds] [NX|XX]

The lock will be auto-released after the expire time is reached.


(2)使用Lua脚本实现cas删除(详见 SET命令页)

It is possible to make this system more robust modifying the unlock schema as follows:

  • Instead of setting a fixed string, set a non-guessable large random string, called token.
  • Instead of releasing the lock with  DEL, send a script that only removes the key if the value matches.



作者:flysharkym 发表于2014-11-12 15:26:19 原文链接
阅读:12 评论:0 查看评论

相关 [redis 分布式锁] 推荐:

如何用redis实现分布式锁

- - CSDN博客数据库推荐文章
redis作为一个强大的key/value数据库,其实还可以用来实现轻量级的分布式锁. 最早官方在 SETNX命令页给了一个实现:. 不过这个方案有漏洞,就是release lock用的DEL命令不支持cas删除(delete if current value equals old value),这样忽略race condition将会出现问题:.

基于redis分布式锁实现“秒杀”

- - 企业架构 - ITeye博客
来自于  http://blog.5ibc.net/p/28883.html. 所谓秒杀,从业务角度看,是短时间内多个用户“争抢”资源,这里的资源在大部分秒杀场景里是商品;将业务抽象,技术角度看,秒杀就是多个线程对资源进行操作,所以实现秒杀,就必须控制线程对资源的争抢,既要保证高效并发,也要保证操作的正确.

Redis分布式锁解决抢购问题

- - 企业架构 - ITeye博客
废话不多说,首先分享一个业务场景-抢购. 一个典型的高并发问题,所需的最关键字段就是库存,在高并发的情况下每次都去数据库查询显然是不合适的,因此把库存信息存入Redis中,利用redis的锁机制来控制并发访问,是一个不错的解决方案.         //这里抛出的异常要是运行时异常,否则无法进行数据回滚,这也是spring中比较基础的  .

Redis 分布式锁原理及 Redisson 实现

- - 叉叉哥的BLOG
Redis 分布式锁原理. Redis 分布式锁原理,可以直接看官方文档:. SET resource-name anystring NX EX max-lock-time 命令可以基于 Redis 实现分布式锁. NX 仅当 key 不存在时设置成功. EX seconds 失效时间(秒). Nil 时,客户端未获得锁,需要过一段时间再重试命令尝试获取锁.

基于Redis实现分布式锁之前,这些坑你一定得知道

- - DockOne.io
【编者的话】基于Redis的分布式锁对大家来说并不陌生,可是你的分布式锁有失败的时候吗. 在失败的时候可曾怀疑过你在用的分布式锁真的靠谱吗. 以下是结合自己的踩坑经验总结的一些经验之谈. 用到分布式锁说明遇到了多个进程共同访问同一个资源的问题,一般是在两个场景下会防止对同一个资源的重复访问:. 比如多个节点计算同一批任务,如果某个任务已经有节点在计算了,那其他节点就不用重复计算了,以免浪费计算资源.

Redis分布式锁的正确实现方式(Java版) - 吴大山的博客 | Wudashan Blog

- -
本博客使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 分布式锁一般有三种实现方式:1. 基于ZooKeeper的分布式锁. 本篇博客将介绍第二种方式,基于Redis实现分布式锁. 虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁.

解读Google分布式锁服务

- XiaoHui - NoSQLfan
在2010年4月,Google的网页索引更新实现了实时更新,在今年的OSDI大会上,Google首次公布了有关这一技术的论文. 在此之前,Google的索引更新,采用的的批处理的方式(map/reduce),也就是当增量数据达到一定规模之后,把增量数据和全量索引库Join,得到最新的索引数据. 采用新的索引更新系统之后,数据的生命周期缩短了50%,所谓的数据生命周期是指,数据从网页上爬下来,到展现在搜索结果中这段时间间隔,但是正如Google所强调的,这一系统仅仅是为增量更新所建立的,并没有取代map/reduce的批量作业处理模式.

分布式锁看这篇就够了

- - zhisheng的博客
转载请务必注明原创地址为: http://www.54tianzhisheng.cn/2018/04/24/Distributed_lock/. 在单进程的系统中,当存在多个线程可以同时改变某个变量(可变共享变量)时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量. 而同步的本质是通过锁来实现的.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

还不会使用分布式锁?从零开始基于 etcd 实现分布式锁

- - 掘金 后端
在单进程的系统中,当存在多个线程可以同时改变某个变量时,就需要对变量或代码块做同步,使其在修改这种变量时能够线性执行消除并发修改变量. 为了实现多个线程在一个时刻同一个代码块只能有一个线程可执行,那么需要在某个地方做个标记,这个标记必须每个线程都能看到,当标记不存在时可以设置该标记,其余后续线程发现已经有标记了则等待拥有标记的线程结束同步代码块取消标记后再去尝试设置标记.