# 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框架的生命周期