当前位置: 首页 > 面试题库 >

如何使用Redis创建分布式锁?

丌官坚秉
2023-03-14
问题内容

在redis文档中,我发现可以通过SETNX实现基本锁:

http://redis.io/commands/setnx

  • C4发送SETNX lock.foo以获取锁

  • 崩溃的客户端C3仍然保留它,因此Redis将以0答复C4。

  • C4发送GET lock.foo以检查锁是否过期。如果不是,它将hibernate一段时间并从头开始重试。

  • 相反,如果由于lock.foo上的Unix时间早于当前Unix时间而使锁过期,则C4尝试执行:

GETSET lock.foo

  • 由于GETSET语义,C4可以检查存储在key上的旧值是否仍然是过期的时间戳。如果是,则已获取锁。

  • 如果另一个客户端(例如C5)比C4快,并通过GETSET操作获得了锁定,则C4
    GETSET操作将返回未过期的时间戳。C4将仅从第一步重新启动。请注意,即使C4在将来几秒钟设置了密钥,这也不是问题。

但是,正如某些用户所评论的那样,使用UNIX时间戳作为到期时间要求客户端和服务器的时间完全同步。有没有更好的选择来在Redis中创建全局/分布式锁?


问题答案:

使用SET代替SETNXSET接受参数以秒和毫秒为单位的到期时间,而不是UNIX时间戳值。

仅基于历史原因记录了基于SETNX的旧模式。

根据SETNX 描述:

注意:从Redis
2.6.12开始,可以使用SET命令来获取锁,并使用简单的Lua脚本来释放锁,从而创建更简单的锁定原语。该模式记录在SET命令页面中。



 类似资料:
  • 主要内容:Redis分布式锁介绍,Redis分布式锁命令在分布式系统中,当不同进程或线程一起访问共享资源时,会造成资源争抢,如果不加以控制的话,就会引发程序错乱。此时使用分布式锁能够非常有效的解决这个问题,它采用了一种互斥机制来防止线程或进程间相互干扰,从而保证了数据的一致性。 提示:如果对分布式系统这一概念不清楚,可参考百度百科《分布式系统》,简而言之,它是一种架构、一种模式。 Redis分布式锁介绍 分布式锁并非是 Redis 独有,比如 MySQ

  • 问题内容: 我想这样布局我的JPane: 这样,顶部比底部更大/更小(顶部由另一个JPanel组成,并使用Graphics对象显示图像,而底部也由另一个JPanel组成,但使用Graphics对象绘制一些线和文字)。 我听说最好的方法是使用GridBagLayout和GridBagConstraints。 我试图找出GridBagConstraints的适当属性,但遇到了一些困难。这是我到目前为止

  • 背景 在很多互联网产品应用中,有些场景需要加锁处理,比如:秒杀,全局递增ID,楼层生成等等。大部分的解决方案是基于DB实现的,Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对redis的连接并不存在竞争关系。其次Redis提供一些命令SETNX,GETSET,可以方便实现分布式锁机制。 一、使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以

  • 本文向大家介绍SpringBoot中使用redis做分布式锁的方法,包括了SpringBoot中使用redis做分布式锁的方法的使用技巧和注意事项,需要的朋友参考一下 一.模拟问题 最近在公司遇到一个问题,挂号系统是做的集群,比如启动了两个相同的服务,病人挂号的时候可能会出现同号的情况,比如两个病人挂出来的号都是上午2号.这就出现了问题,由于是集群部署的,所以单纯在代码中的方法中加锁是不能解决这种

  • 问题内容: 当前,我正在使用node.js和redis来构建应用程序,使用redis的原因是由于发布/订阅功能。该应用程序只是在用户进入用户或不在房间时通知管理员。 由于我想听join和disjoin事件,我的问题是我是否应该使用两个redisclient来听这两个事件,例如 或者只是使用一个redisclient来监听和分离回调中的逻辑 我知道这两种方式都是可行的,但是我不知道人们在哪种情况下会

  • 面试题 一般实现分布式锁都有哪些方式?使用 redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高? 面试官心理分析 其实一般问问题,都是这么问的,先问问你 zk,然后其实是要过渡到 zk 相关的一些问题里去,比如分布式锁。因为在分布式系统开发中,分布式锁的使用场景还是很常见的。 面试题剖析 redis 分布式锁 官方叫做 RedLock 算法,是