# Beanstalkd
**定義:輕量級,高性能,縫補是內存隊列系統**
## 一.特性
1. 優先級(priority)
* 支持任務插隊,數字越小,優先級越高,0是最高
2. 延遲(delay)
* 實現定時任務.比如論壇增加定時評論
3. 持久化(persistent data)
* 支持定時將文件刷到日志中,即使宕機,重啟后扔可找回文件
4. 預留(buried)
* 支持吧一個任務設置為預留,這樣,消費者就無法取出這個任務,等合適時機再拿
5. 任務超時重發(time-to-run)
* 消費者必須再指定的世界內處理完這個任務,否則任務處理失敗,會重新放的隊列,等待消費
## 二.管道(tube)與任務(job)
任務從進入管道到離開管道一共五個狀態(reday,delayed,reserved,buried,delete)
1. 生產者將任務放到管道中,任務的狀態可以是ready(表示任務已經準備好,隨時可以被消費者讀取),也可以是delayed(任務在被生產者放入管道時,設置了延遲,比如設置了5s延遲,意味著5s之后,這個任務才會變成ready狀態,才可以被消費者讀取)
2. 消費者消費任務(消費者將處于ready狀態的任務讀出來后,被讀取處理的任務狀態變為reserved)
3. 消費者處理完任務后,任務的狀態可能是delete(刪除,處理成功),可能是buried(預留,意味著先把任務放一邊,等待條件成熟還要用),可能是ready,也可能是delayed,需要根據具體業務場景自己進行判斷定義
4. 項目中的應用總結
生產者中常用的方法
useTube() : 如果沒有管道,則創建對應管道,有,則直接使用
put() : 向管道中放任務
消費者中常用的方法步驟:
1. watch():監聽管道
2. reserve():將管道中處于ready狀態的任務讀取出來
3.1 可以使用delete 方法刪除任務
3.2 可以使用release 方法將任務放回ready狀態
3.3 可以使用bury 方法將任務先放一邊(例如發郵件,郵箱服務器掛掉),等待條件成熟再取出來
### 五? 使用Beanstalkd 實現類似redis秒殺活動
~~~
<?php
require "vendor/autoload.php";
use Pheanstalk\Pheanstalk;
//連接beanstalkd
$ph = new Pheanstalk('127.0.0.1', 11301);
$tube_name = 'SecKill2';
//使用SecKill2管道
$SEC = $ph->useTube($tube_name);
//模擬100人請求秒殺
for ($i = 0; $i < 100; $i++) {
$uid = rand(10000000, 99999999);
//獲取當前隊列已經擁有的數量,如果人數少于十,則加入這個隊列
$total_jobs = $ph->statsTube($tube_name)['total-jobs'];
$num = 10;
if ($total_jobs < $num) {
$SEC->put($uid);//向管道放任務
echo $uid . "秒殺成功";
} else {
//如果當前隊列人數已經達到10人,則返回秒殺已完成
echo "秒殺已結束<br>";
}
}
print_r($ph->statsTube($tube_name));//查看SecKill2管道的信息
~~~
# Beanstalked的初步了解和使用(包括利用beanstalkd 秒殺消息隊列的實現)
- 消息隊列
- 為什么要用消息隊列
- 各種消息隊列產品的對比
- 消息隊列的優缺點
- 如何保證消息隊列的高可用
- 如何保證消息不丟失
- 如何保證消息不會重復消費?如何保證消息的冪等性?
- 如何保證消息消費的順序性?
- 基于MQ的分布式事務實現
- Beanstalk
- PHP
- 函數
- 基礎
- 基礎函數題
- OOP思想及原則
- MVC生命周期
- PHP7.X新特性
- PHP8新特性
- PHP垃圾回收機制
- php-fpm相關
- 高級
- 設計模式
- 排序算法
- 正則
- OOP代碼基礎
- PHP運行原理
- zavl
- 網絡協議new
- 一面
- TCP和UDP
- 常見狀態碼和代表的意義以及解決方式
- 網絡分層和各層有啥協議
- TCP
- http
- 二面
- TCP2
- DNS
- Mysql
- 鎖
- 索引
- 事務
- 高可用?高并發?集群?
- 其他
- 主從復制
- 主從復制數據延遲
- SQL的語?分類
- mysqlQuestions
- Redis
- redis-question
- redis為什么那么快
- redis的優缺點
- redis的數據類型和使用場景
- redis的數據持久化
- 過期策略和淘汰機制
- 緩存穿透、緩存擊穿、緩存雪崩
- redis的事務
- redis的主從復制
- redis集群架構的理解
- redis的事件模型
- redis的數據類型、編碼、數據結構
- Redis連接時的connect與pconnect的區別是什么?
- redis的分布式鎖
- 緩存一致性問題
- redis變慢的原因
- 集群情況下,節點較少時數據分布不均勻怎么辦?
- redis 和 memcached 的區別?
- 基本算法
- MysqlNew
- 索引new
- 事務new
- 鎖new
- 日志new
- 主從復制new
- 樹結構
- mysql其他問題
- 刪除
- 主從配置
- 五種IO模型
- Kafka
- Nginx
- trait
- genergtor 生成器
- 如何實現手機掃碼登錄功能
- laravel框架的生命周期