日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php redis zset 延迟队列_PHP + Redis 实现简单消息队列

發布時間:2024/9/27 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php redis zset 延迟队列_PHP + Redis 实现简单消息队列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis做消息隊列的好處在于它的輕量級,高并發,延遲敏感。

應用場景有即時數據分析、秒殺計數器、緩存等。

Redis做消息隊列待解決的問題:

1.消息的可靠性:

沒有相應的機制保證消息的消費,當消費者消費失敗的時候,消息體丟失,需要手動處理。生產者只管向隊列中插入數據,不管消費者是否成功消費。

2.消費者掛掉消息不會丟失,但是需要重新觸發一下消費者,才能夠繼續消費消息。

代碼如下:

lib.php 是工具文件,里面有數據庫的連接、Redis的連接:

<?php /** * 獲取數據庫連接 * * @param $host * @param $username * @param $password * @param $database * @return mysqli */function getDBConnection($host, $username, $password, $database){ $connection = new mysqli('p:'.$host, $username, $password, $database); if (!$connection) { echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; } mysqli_query($connection, "set names 'utf8'"); return $connection;} /** * 獲取Redis連接 * * @param $host * @param $port * @param string $password * @param int $database * @return Redis */function getRedis($host='127.0.0.1', $port='6379', $password=null, $database=0){ $redis = new Redis(); if(!$redis->connect($host, $port)){ die("Redis連接失敗:IP或端口有誤"); } if(!empty($password) && !$redis->auth($password)){ die("Redis連接失敗:密碼錯誤"); } if($database){ $redis->select($database); } // work中 subscribe 如果一段時間沒有接到消息,就會停掉然后停掉,所以加這個語句讓其永不超時 $redis->setOption(Redis::OPT_READ_TIMEOUT, -1); return $redis;} /** * 打印消息日志 * * @param $msg */function stdout($msg=null){ $msg = '['.date('Y-m-d H:i:s').']'.$msg.chr(10);; fwrite(STDOUT, $msg);}

register.php 是消息發布者,注釋的是將消息存入數據庫部分的代碼。

首先想消息存入 register_users 隊列中,存入的 key是register_users;value是一個list,消息全部存入其中。

用 redis-cli 查看數據的命令是:

LRANGE register_users 0 -1

register.php:

<?php require './lib.php';$name = $argv[1];$mobile = $argv[2];if(empty($name) || empty($mobile)){ die("參數錯誤");}// $connection = getDBConnection('localhost:3306', 'root', 'root', 'blog');// // 開啟事務// mysqli_begin_transaction($connection);// $sql = "insert into mq_user(name, mobile) values ('$name', '$mobile')";// if(!mysqli_query($connection, $sql)){// die("寫入用戶信息失敗,原因:".$connection->error);// }$redis = getRedis();// 添加消息$result = $redis->lpush('register_users', json_encode(array('name'=>$name, 'mobile'=>$mobile), JSON_UNESCAPED_UNICODE));if($result === false){ mysqli_rollback($connection); die("添加消息隊列失敗");}// 發布消息$redis->publish('register_success', 'ok');// 所有操作完成后提交事務// mysqli_commit($connection);// $connection->close();$redis->close();

work.php 做為消息的消費者

<?php require './lib.php';$redis = getRedis();$redis->subscribe(['register_success'], function ($instance, $channelName, $message) { if($channelName == "register_success" && $message = "ok") { $redis = getRedis(); while($redis->lsize("register_users")>0) { $arr = $redis->brPop(['register_users'], 20); if(count($arr)) { $userInfo = json_decode($arr[1], true); stdout("新注冊用戶信息:"); stdout("姓名:".$userInfo['name']); stdout("手機號:".$userInfo['mobile']); stdout(); sleep(3); } } }});

register.php將消息放入redis 的 register_users隊列中,然后再使用 publish 將 register_success 消息發不出去。

work.php 使用 subscribe 訂閱register_success 的消息。

接收到 register_success 消息之后,讀取 register_users 的消息進行處理。

來源:https://www.cnblogs.com/Lyh1997/p/11491046.html

·END·

PHP開源社區進階·提升·漲薪

總結

以上是生活随笔為你收集整理的php redis zset 延迟队列_PHP + Redis 实现简单消息队列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。