国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

webman 的 redis 庫 Redis::setNx 方法不是原子性的嗎?

lscho

背景描述

部署環(huán)境為分布式部署,定時任務(wù)期望其中某臺服務(wù)器執(zhí)行,故在代碼中使用 Redis::setNx 來創(chuàng)建任務(wù)鎖,期望拿到鎖的服務(wù)器執(zhí)行任務(wù)。

示例代碼

        // 每天凌晨2點執(zhí)行更新狀態(tài)信息
        new Crontab('0 2 * * *', function () {
            // 負載均衡下有多臺服務(wù)器,所以拿到更新鎖的服務(wù)器才能執(zhí)行任務(wù)
            $lock = Redis::setNx('update_status_' . date('Y-m-d'), 1);
            if ($lock) {
                // 執(zhí)行更新任務(wù)
            }
        });

結(jié)果

本地測試沒有問題,但是在服務(wù)器中,多臺服務(wù)器都會執(zhí)行更新任務(wù),請問問題出在哪里?

結(jié)帖

感謝大佬們幫助,問題找到了。上次發(fā)版拉配置中心的配置,拉redis的配置失敗了,導致走了默認的配置,應(yīng)用服務(wù)器都連到自己所在服務(wù)器的redis了。

2484 7 2
7個回答

admin

Redis 的 setNx 操作實現(xiàn)確實是原子性的,可以保證在并發(fā)場景下正確的實現(xiàn)資源鎖定,但是在分布式場景下,多個服務(wù)器同時連接 Redis 數(shù)據(jù)庫,不同服務(wù)器之間存在網(wǎng)絡(luò)延遲等問題,可能導致 Redis 數(shù)據(jù)庫中的鎖被多個服務(wù)器同時獲取。因此,即使使用 Redis 的 setNx 操作也無法保證在分布式環(huán)境下的互斥訪問。

為解決這類問題,我們可以采用分布式鎖的方式,例如基于 ZooKeeper 或 Redis 實現(xiàn)的分布式鎖。這樣可以保證分布式環(huán)境下的互斥訪問,并且可以實現(xiàn)高可用性。具體來說,分布式鎖需要保證:

  • 唯一性。同一時刻只能有一個進程持有鎖。
  • 可重入性。同一個進程可以重復獲取鎖。
  • 超時機制。當持有鎖進程出現(xiàn)異常情況(如網(wǎng)絡(luò)故障、進程崩潰等),鎖應(yīng)具有自動釋放能力,防止資源被一直占用。

還有就是試試 redis集群自帶的key的分片,分片到指定的redis服務(wù)器,這樣可能就不會造成多個服務(wù)器拿到鎖。

這是我自己想想的,沒有經(jīng)過實踐,如解決了就更好了

  • pader 2023-08-03

    你這是什么回答?setnx 可以保證原子性,即使存在網(wǎng)絡(luò)延遲也不影響這一點,簡單的防并發(fā)用 setnx 完全沒有問題。你這看著像 ChatGPT 回答的。

  • 小W 2023-08-03

    按照上面說的,是不是會出現(xiàn)死鎖吧

yongdao35

看下用的redis是否同一個配置,并且db相同,每臺服務(wù)器系統(tǒng)的日期設(shè)置是否正確

  • 暫無評論
yzh52521

http://m.wtbis.cn/plugin/42
你可以看下我這個插件的源碼

  • kaka1915 2023-08-01

    我看你的介紹有后臺界面。為啥我下載下來了沒有呢 就是你展示的效果圖那種

  • yzh52521 2023-08-01

    界面是自己項目里的ui

  • kaka1915 2023-08-01

    大佬 沒有看到有sql文件呢

  • yzh52521 2023-08-02

    在源碼里,運行的時候就創(chuàng)建好了表

ichynul

你這鎖有點簡單了,建議用開源的,不要自己實現(xiàn)。
雖然沒看到你解鎖的代碼。但可以猜測是用Redis::del()吧。
解鎖還是會有問題的。
推薦你用我這個:https://github.com/ichynul/php-redis-lock

  • 暫無評論
smile1

如果是分布式的場景下,使用redis ,是不是只有指定到固定的節(jié)點去拿鎖和加鎖呀,要不然就是偽概念紅鎖來處理

  • 暫無評論
qq7467466

搞那么多亂七八糟的, 分布式場景下推薦用這個鎖

https://github.com/ronnylt/redlock-php

  • 暫無評論
efnic

推薦用這個http://m.wtbis.cn/plugin/55
基于symfony/lock的,質(zhì)量有保證。

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??