亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

PHP實現基于Redis的MessageQueue隊列封裝操作示例

2019-11-19 12:10:37
字體:
來源:轉載
供稿:網友

本文實例講述了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');    }  }}

如果需要一次寫入多個隊列,可以使用如下調用方式:

<?php$redis = new RedisMessageQueue();$redis->puts(1, 2, 3, 4);$redis->puts(5, 6, 7, 8, 9);

模仿HTTPSQS輸出結果的封裝如下,提供了寫入位置和讀取位置記錄的功能:

<?php/** * Created by PhpStorm. * User: huyanping * Date: 14-9-5 * Time: 下午2:16 * * 附加了隊列狀態信息的RedisMessageQueue */namespace Zebra/MessageQueue;class RedisMessageQueueStatus extends RedisMessageQueue {  protected $record_status;  protected $put_position;  protected $get_position;  public function __construct(    $server_config = array('IP' => '127.0.0.1', 'PORT' => '6379'),    $key = 'redis_message_queue',    $p_connect = false,    $record_status=true  ){    parent::__construct($server_config, $key, $p_connect);    $this->record_status = $record_status;    $this->put_position = $this->key . '_put_position';    $this->get_position = $this->key . '_get_position';  }  public function get(){    if($queue = parent::get()){      $incr_result = $this->redis_server->incr($this->get_position);      if(!$incr_result) throw new /Exception('can not mark get position,please check the redis server');      return $queue;    }else{      return false;    }  }  public function put($message){    if(parent::put($message)){      $incr_result = $this->redis_server->incr($this->put_position);      if(!$incr_result) throw new /Exception('can not mark put position,please check the redis server');      return true;    }else{      return false;    }  }  public function puts_status(){    $message_array = func_get_args();    $result = call_user_func_array(array($this, 'puts'), $message_array);    if($result){      $this->redis_server->incrBy($this->put_position, count($message_array));      return true;    }    return false;  }  public function size(){    return $this->redis_server->lSize($this->key);  }  public function status(){    $status['put_position'] = ($put_position = $this->redis_server->get($this->put_position)) ? $put_position : 0;    $status['get_position'] = ($get_position = $this->redis_server->get($this->get_position)) ? $get_position : 0;    $status['unread_queue'] = $this->size();    $status['queue_name'] = $this->key;    $status['server'] = $this->server;    $status['port'] = $this->port;    return $status;  }  public function status_normal(){    $status = $this->status();    $message = 'Redis Message Queue' . PHP_EOL;    $message .= '-------------------' . PHP_EOL;    $message .= 'Message queue name:' . $status['queue_name'] . PHP_EOL;    $message .= 'Put position of queue:' . $status['put_position'] . PHP_EOL;    $message .= 'Get position of queue:' . $status['get_position'] . PHP_EOL;    $message .= 'Number of unread queue:' . $status['unread_queue'] . PHP_EOL;    return $message;  }  public function status_json(){    return /json_encode($this->status());  }}

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php+redis數據庫程序設計技巧總結》、《php面向對象程序設計入門教程》、《PHP基本語法入門教程》、《PHP數組(Array)操作技巧大全》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總

希望本文所述對大家PHP程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
俺也去精品视频在线观看| 精品女厕一区二区三区| 欧美噜噜久久久xxx| 成人国产在线激情| 国产在线拍揄自揄视频不卡99| 国产精品偷伦免费视频观看的| www.欧美视频| 精品国产成人av| 欧美黑人国产人伦爽爽爽| 久久久久久久久久久人体| 欧美一区在线直播| 国产精品旅馆在线| 亚洲性生活视频在线观看| 77777亚洲午夜久久多人| 欧美一区亚洲一区| 在线电影av不卡网址| 午夜精品视频在线| 最好看的2019年中文视频| 久久久久久国产精品久久| 亚洲最大福利视频网站| 欧美高清视频在线播放| 国产97在线播放| 欧美高清视频在线观看| 超碰日本道色综合久久综合| 欧美性视频网站| 亚洲欧美激情精品一区二区| 色伦专区97中文字幕| 国产欧洲精品视频| 成人国内精品久久久久一区| 黄网站色欧美视频| 欧美片一区二区三区| 欧美日韩中文字幕| 日韩欧美极品在线观看| 亚洲精品欧美一区二区三区| 亚洲天堂男人的天堂| 国产精品网址在线| 日韩av免费在线播放| 久久精品2019中文字幕| 在线观看国产精品淫| 国产精品老牛影院在线观看| 国产成人97精品免费看片| 精品国产老师黑色丝袜高跟鞋| 久久精品久久久久电影| 国产99在线|中文| 欧美成在线观看| 亚洲午夜久久久影院| 日韩成人中文字幕| 国产精品国产亚洲伊人久久| 精品亚洲一区二区三区| 欧美精品久久久久a| 操人视频在线观看欧美| 亚洲第一级黄色片| 欧美另类第一页| 黑人巨大精品欧美一区二区免费| 国产精品日日摸夜夜添夜夜av| 亚洲精品日韩av| 亚洲国产欧美日韩精品| 欧美日韩另类字幕中文| 日韩av电影免费观看高清| 国产69精品久久久久久| 91久久久久久久久| 欧美精品午夜视频| 成人精品一区二区三区电影免费| 色www亚洲国产张柏芝| 欧美激情在线有限公司| 国产成人精品亚洲精品| 国产精品久久久亚洲| 亚洲欧美综合图区| 日韩美女视频在线观看| 欧美重口另类videos人妖| 综合欧美国产视频二区| 欧美日韩成人在线播放| 久久躁日日躁aaaaxxxx| 精品国产一区久久久| 久久久久久久久网站| 欧美激情视频在线免费观看 欧美视频免费一| 精品久久久久久国产| 欧美国产日本高清在线| 国产亚洲a∨片在线观看| 国产丝袜精品第一页| 欧美在线视频免费观看| 亚洲国产美女久久久久| 成人久久久久久久| 97超级碰在线看视频免费在线看| 久久精品美女视频网站| 亚洲风情亚aⅴ在线发布| 奇门遁甲1982国语版免费观看高清| 精品一区二区三区三区| 欧美成人精品h版在线观看| 亚洲精品女av网站| 在线播放精品一区二区三区| 亚洲人成网站色ww在线| 中文字幕日韩精品有码视频| 黑人精品xxx一区一二区| 久久成人18免费网站| 欧美久久精品午夜青青大伊人| 亚洲免费电影在线观看| 91在线视频成人| 日韩av在线网站| 久久久久中文字幕| 亚洲欧美国产精品久久久久久久| 欧美成人三级视频网站| 欧美日韩色婷婷| 中文字幕在线精品| 国产精品美女免费| 国产成人久久久| 午夜精品久久久久久久久久久久久| 日韩人在线观看| 92版电视剧仙鹤神针在线观看| 成人激情在线播放| 国内揄拍国内精品| 久久的精品视频| 久久久久久国产精品久久| 亚洲欧美国产精品久久久久久久| 精品久久国产精品| 欧美激情一区二区久久久| 欧美一区二三区| 一区二区中文字幕| 欧美最顶级的aⅴ艳星| 色偷偷91综合久久噜噜| 精品美女永久免费视频| 日韩国产高清污视频在线观看| 岛国av一区二区在线在线观看| 91精品在线影院| 国产精品亚洲一区二区三区| 国内精品久久久久影院优| 日韩精品电影网| 国产精品福利久久久| 欧美精品video| 久久香蕉国产线看观看av| 欧美理论电影在线播放| 在线看欧美日韩| 日韩中文av在线| 成人网在线视频| 国产亚洲一区二区精品| 97av在线影院| 国产精品久久久久久久9999| 国产日韩在线精品av| 日本道色综合久久影院| www.日韩不卡电影av| 欧美在线免费看| 久久69精品久久久久久久电影好| 日韩av免费在线播放| 日本欧美精品在线| 日韩高清不卡av| 亚洲一区二区少妇| 国产成人精品免费视频| 国产精品久久久久久av福利| 久久99热精品这里久久精品| 久久久中精品2020中文| 国产精品va在线播放| 欧美日韩日本国产| 久久久久久国产三级电影| 77777少妇光屁股久久一区| 日韩电影免费观看在线观看| 中文字幕精品在线视频| 久久久久久美女| 日韩专区中文字幕| 国产精品免费福利| 日本成人黄色片| 国内精品小视频在线观看| 欧洲亚洲女同hd| 亚洲色图色老头| 国产精品爽爽爽爽爽爽在线观看|