本文實例講述了PHP實現基于Redis的MessageQueue隊列封裝操作。分享給大家供大家參考,具體如下:
Redis的鏈表List可以用來做鏈表,高并發的特性非常適合做分布式的并行消息傳遞。
項目地址:https://github.com/huyanping/Zebra-PHP-Framework
左進右出
$redis->lPush($key, $value);$redis->rPop($key);
以下程序已在生產環境中正式使用。
基于Redis的PHP消息隊列封裝
<?php/** * Created by PhpStorm. * User: huyanping * Date: 14-8-19 * Time: 下午12:10 * * 基于Redis的消息隊列封裝 */namespace Zebra/MessageQueue;class RedisMessageQueue implements IMessageQueue{ protected $redis_server; protected $server; protected $port; /** * @var 消息隊列標志 */ protected $key; /** * 構造隊列,創建redis鏈接 * @param $server_config * @param $key * @param bool $p_connect */ public function __construct($server_config = array('IP' => '127.0.0.1', 'PORT' => '6379'), $key = 'redis_message_queue', $p_connect = false) { if (empty($key)) throw new /Exception('message queue key can not be empty'); $this->server = $server_config['IP']; $this->port = $server_config['PORT']; $this->key = $key; $this->check_environment(); if ($p_connect) { $this->pconnect(); } else { $this->connect(); } } /** * 析構函數,關閉redis鏈接,使用長連接時,最好主動調用關閉 */ public function __destruct() { $this->close(); } /** * 短連接 */ private function connect() { $this->redis_server = new /Redis(); $this->redis_server->connect($this->server, $this->port); } /** * 長連接 */ public function pconnect() { $this->redis_server = new /Redis(); $this->redis_server->pconnect($this->server, $this->port); } /** * 關閉鏈接 */ public function close() { $this->redis_server->close(); } /** * 向隊列插入一條信息 * @param $message * @return mixed */ public function put($message) { return $this->redis_server->lPush($this->key, $message); } /** * 向隊列中插入一串信息 * @param $message * @return mixed */ public function puts(){ $params = func_get_args(); $message_array = array_merge(array($this->key), $params); return call_user_func_array(array($this->redis_server, 'lPush'), $message_array); } /** * 從隊列頂部獲取一條記錄 * @return mixed */ public function get() { return $this->redis_server->lPop($this->key); } /** * 選擇數據庫,可以用于區分不同隊列 * @param $database */ public function select($database) { $this->redis_server->select($database); } /** * 獲得隊列狀態,即目前隊列中的消息數量 * @return mixed */ public function size() { return $this->redis_server->lSize($this->key); } /** * 獲取某一位置的值,不會刪除該位置的值 * @param $pos * @return mixed */ public function view($pos) { return $this->redis_server->lGet($this->key, $pos); } /** * 檢查Redis擴展 * @throws Exception */ protected function check_environment() { if (!/extension_loaded('redis')) { throw new /Exception('Redis extension not loaded'); } }}
新聞熱點
疑難解答
圖片精選