集群模式下,redis锁的问题,红锁

在使用redis来实现分布式锁的时候,如果redis是集群的,比如1主4从,这种主从模式就会存在延迟问题,导致加锁出现问题。

此时就应该使用红锁的方案,即在代码中不依赖于主从,将这5台机器视为平等的,在代码中依次对这5台机器去加锁,只有成功的机器数大于一半就算加锁成功,其他机器也就没必要再去操作了,相反,如果大于一半的机器失败了,就算失败,其他机器也就没必要再去操作了。

由于是遍历操作这5台机器,也就不用关心有没有机器挂掉了,因为挂掉了自然算加锁失败。红锁方案要求机器数为奇数。而且从原理上来看,每一个请求都会从前往后的顺序依次去操作这些机器,而不是乱序的,也就不会出现死锁的问题。

为什么叫红锁?
因为这个方案是redis创始人发明的,本应该叫 Redis Lock,但是简写成 RedLock。

在这里插入图片描述
问题1:
请求1依次加锁1,2,3成功,算成功,不巧此时机器3没了,数据也丢了,然而运维手速很快,立马搞了台新机器6放在了3的位置上,显然6里面并没有加锁的key,如果此时请求2来加锁,1错,2错,3对,4对,5对;显然就加锁成功了,于是就出现了并发问题了,这种情况呢,只能在运维手册里写明,这5台机器,要特殊对待,延迟一段时间再去部署,通过人为来把控。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis 集群中,每个节点都运行一个 Redis 实例,并且所有节点都需要使用相同的配置文件。以下是 Redis 集群模式下的配置建议: ``` # 开启集群模式 cluster-enabled yes # 集群节点超时时间,单位为毫秒 cluster-node-timeout 15000 # 集群中每个节点的唯一标识符,格式为 IP:PORT cluster-announce-ip <your_node_ip> cluster-announce-port <your_node_port> # 集群中所有节点的 IP 地址和端口号,格式为 IP:PORT IP:PORT ... cluster-initial-nodes <node_1> <node_2> <node_3> ... # 可以设置密码来保护 Redis 集群 requirepass <your_password> ``` 其中,`cluster-enabled` 用于开启 Redis 集群模式;`cluster-node-timeout` 是节点间通信的超时时间,建议设置为 15 秒;`cluster-announce-ip` 和 `cluster-announce-port` 用于设置当前节点的 IP 地址和端口号;`cluster-initial-nodes` 是初始节点列表,需要包含集群中所有节点的 IP 地址和端口号;`requirepass` 是用于保护 Redis 集群的密码,建议设置一个强密码。 另外,对于每个节点,需要将 `redis.conf` 中的 `port` 参数设置为该节点的端口号,并在启动节点时使用其它选项,例如: ``` ./redis-server /path/to/redis.conf --port 6379 ./redis-server /path/to/redis.conf --port 6380 ./redis-server /path/to/redis.conf --port 6381 ... ``` 需要确保所有节点的配置文件中的参数都相同,并且所有节点都使用相同的密码(如果有的话)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值