登录
首页 >  Golang >  Go问答

带 SETNX 的单实例 Redis 锁

来源:Golang技术栈

时间:2023-03-22 17:42:40 133浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《带 SETNX 的单实例 Redis 锁》带大家来了解一下带 SETNX 的单实例 Redis 锁,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我需要从应用程序客户端连接到单个 Redis 实例。

由于客户端将在 Kubernetes 中复制,因此我正在研究有关锁定的 Redis 文档以防止客户端副本之间的竞争。

经过一番谷歌搜索和阅读后,我将注意力集中在这两个资源上:

  • 此处描述的SETNX命令:https ://redis.io/commands/setnx
  • 此处描述的 Redlock 算法:https ://redis.io/topics/distlock

有趣的是,SETNX文档明确建议不要使用SETNX来实现锁,并指出它基本上已经过时了:

不鼓励使用以下模式以支持 Redlock 算法 [...]

无论如何,我们都会记录旧模式,因为某些现有实现链接到此页面作为参考。

然而,Redlock 算法是专门为 分布式 锁量身定做的,因此当一个人试图锁定多个 Redis 实例时 - 它们实际上是指多个 master

更进一步,库redsync (golang) 声明New函数如下:

func New(pools []Pool) *Redsync {
    return &Redsync{
        pools: pools,
    }
}

它看起来毫无疑问是为了支持 Redis 集群上的锁定而设计的。

在我的用例中,我将只连接到一个 Redis 实例。

也许我可以只使用 redsync 包并传递一个长度为 1 的切片,但在我看来,该SETNX模式在单个 Redis 实例上也可以同样正常工作。

我看对了吗?谢谢

正确答案

是的,Redlock 算法确实是为分布式 Redis 系统设计的,如果您使用的是单个实例,那么使用SETSETNX文档中描述的更简单的锁定方法应该没问题。

但是,更重要的一点是: 您可能不需要使用锁来避免多个 Redis 客户端之间的冲突 。Redis 锁通常用于保护一些 外部分布式资源(有关[ 此](https://stackoverflow.com/questions/54811994/what-problem-does-the-redis- distributed-lock-solve/54837601#54837601)内容的更多信息,请参见我的答案)。在 Redis 本身内部,锁通常是不需要的;由于 Redis 的单线程特性,许多命令已经是原子的,您可以使用事务或 Lua 脚本来组合任意复杂的原子操作。

因此,我的建议是设计您的客户端代码以使用原子性来避免冲突,而不是尝试使用锁(分布式或其他方式)。

今天关于《带 SETNX 的单实例 Redis 锁》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于golang的内容请关注golang学习网公众号!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>