laravel 利用redis 的發(fā)布訂閱保持?jǐn)?shù)據(jù)一致性

保持?jǐn)?shù)據(jù)一致性

項(xiàng)目服務(wù)之間共用配置信息可以存儲(chǔ)在遠(yuǎn)程的redis,怎樣保存數(shù)據(jù)的一致性是個(gè)問題??梢允褂胷edis 的發(fā)布訂閱功能及時(shí)同步數(shù)據(jù),思路

  1. 數(shù)據(jù)有變化的服務(wù)更新遠(yuǎn)程redis,并publish key 值到頻道
  2. 訂閱了數(shù)據(jù)的服務(wù)就會(huì)收到信息并去同步數(shù)據(jù)

可以把更新操作加到任務(wù)隊(duì)列,這樣就可以把業(yè)務(wù)和redis 處理分開。用laravel 這樣實(shí)現(xiàn)

# controller 
public function updateConfig(Request $request)
{
    // 其他邏輯...

    // 分發(fā)任務(wù)到隊(duì)列
    cacheJob::dispatch('setCacheData', $request->all());
}

# 命令創(chuàng)建任務(wù) php artisan make:job cacheJob
class cacheJob implements ShouldQueue{
    public function __construct($callback, $arguments)
    {
        $this->callback =$callback;
        $this->arguments =$arguments;
    }

    public function handle()
    {
       call_user_func($this->callback, $this->arguments);
    }

    # setCacheData
    public function setCacheData($params)
    {
        // set....
        $value = $params['data'];
        $this->redis = $this->getRedis();
        $this->redis->set('dataKey', $value);
        // publish 比如頻道名test
        $this->redis->publish('test', 'dataKey');        
    } 
}

接下來再啟動(dòng)php artisan queue:work 去處理隊(duì)列里面的任務(wù)。可以用supervisor 管理該進(jìn)程,設(shè)置隨系統(tǒng)啟動(dòng),啟動(dòng)的進(jìn)程個(gè)數(shù)。

那些訂閱遠(yuǎn)程redis test 頻道的客戶端就會(huì)收到同步信息,可以在需要訂閱數(shù)據(jù)的服務(wù)所在機(jī)器上簡單建一個(gè)訂閱服務(wù),一旦收到信息就同步。如下圖

subscribe1.png

subscribe/publish 在同一臺(tái)機(jī)器上,可以是不相關(guān)的兩個(gè)服務(wù)。在subscribe 利用laravel構(gòu)建自定義命令,別忘記在Console/Kernel.php 添加命令類。同樣利用surpvisor 管理訂閱進(jìn)程,這樣就可以保持?jǐn)?shù)據(jù)一致性了!

# php artisan make command subscribeTest
class subscribeTest extends Command{
    public function handle()
    {
        $this->redis = $this->getRedis();
        $this->redis->subscribe(['test'], function ($message) {
            // 獲取數(shù)據(jù)....
            $this->getData($message);
        });
   }
}

歡迎大家給我留言,提建議,指出錯(cuò)誤,一起討論學(xué)習(xí)技術(shù)的感受!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容