beanstalkd队列
数据结构里面的队列是先进先出的数据结构,在服务器开发中使用队列可以有效的实现任务的异步处理,把耗时的任务放在一个队列中,由消费者去自动处理,比如客户端用户把错题生成pdf文件下载,可以在客户端点击生成的时候把任务放入队列异步处理,然后直接先返回给用户结果,而不必让用户等待。
队列用处
- 异步处理:用户注册后查找数据库发送邮件推荐商品,把推荐商品放入队列。
- 系统解耦:上面的过程将用户注册和推荐商品分离开来了。
- 定时任务: 把考生的试卷提交信息提前放入队列,每天固定某个时间实现自动批改选择题。
beanstalkd工具
beanstalked是一个简单的快速的通用的轻量级内存队列,可以实现百万级任务处理。
特性
- 优先级:可以设置任务的优先级
- 延迟: 设置任务多少秒后才允许被消费者使用
- 持久化:定时刷新数据到文件,服务器挂掉后数据依旧存在
- 超时会重发:消费者必须在指定时间内完成任务,否则就会重新放入管道
- 任务预留:消费者先暂时跳过任务不处理


ready:任务已经准备好了,可以给消费者使用。
delay:任务放入管道的时候设置了延迟时间。
reserve:消费者把任务读取出来
buried:任务先放在一边,以后还会用
delete:任务从队列删除
安装
地址:https://github.com/kr/beanstalkd
可以通过源代码安装或者包管理工具(brew,apt-get)安装,安装完成后输入beanstalkd会由相应的命令.

首先使用下面的命令绑定本地地址和端口号
beanstalkd -l 127.0.0.1 -p 11300 &
beanstalkd的类管理
可以使用pheantalkphp类操作beanstalkd,pheantalk是对beanstalkd命令的封装。可以通过该类实现对任务的操作。
https://github.com/pda/pheanstalk
require 'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk('127.0.0.1',);
//查看beanstalk的当前信息命令行的封装
print_r($pheanstalk->stats());

print_r($pheanstalk->putInTube('mytube','job',1000));
$job = $pheanstalk->watch('mytube')->reserve();
print_r( $pheanstalk->statsJob($job));

还有其他的操作如下
require 'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
//现在命令行输入 beanstalkd -l 127.0.0.1 -p 11300 & 开启
$pheanstalk = new Pheanstalk('127.0.0.1',11300);
//查看beanstalk的当前信息
// 可以通过命令行对管道进行管理,本php类对管道的管理就是对beanstalkd命令行的封装
print_r($pheanstalk->stats());
// 当前的管道
print_r($pheanstalk->listTubes());
// 查看默认的管道
print_r($pheanstalk->statsTube('default'));
//在mytube 里面放入任务 one,使用默认的优先级,延迟重发时间,超时重发时间,
$pheanstalk->useTube('mytube')->put('one');
//从管道取出任务
$job = $pheanstalk->watch('mytube')->reserve();
//根据job的编号获取信息
$job = $pheanstalk->peek(1);
$pheanstalk->delete($job);//删除任务
$pheanstalk->watch('mytube')->delete($job);
//会把任务重新放入管道,并把任务设置为ready状态
$pheanstalk->release($job);
//把任务放在一边暂时不处理,条件成熟了在读取出来
$pheanstalk->bury($job);
$pheanstalk->peekBuried('mytube');// 获取处理bury状态的任务
$pheanstalk->kickJob($job);//会把job转变成ready状态
$pheanstalk->kick(200);//把job编号小于200的变成ready状态
//--- 获取某个状态的任务
$pheanstalk->peekDelayed();
$pheanstalk->peekReady();
$pheanstalk->peekBuried();
$pheanstalk->pauseTube('mytube',10);//阻塞整个管道时间
生成者和消费者
生产者将任务放入队列
require 'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
$pheanstalk = new Pheanstalk("127.0.0.1",11300);
$pheanstalk->useTube('mytube')->put('one',1024,10,3);
$pheanstalk->useTube('mytube')->put('two',1023);
$pheanstalk->useTube('mytube')->put('three',1025);
print_r($pheanstalk->stats());
消费者处理任务
require 'vendor/autoload.php';
use Pheanstalk\Pheanstalk;
//终端等待表示没有生产者产生数据
$pheanstalk = new Pheanstalk("127.0.0.1",11300);
//reserve可以设置阻塞时间,不设置会一直等待,watch 可以同时监听两个管道,
$job = $pheanstalk->watch('mytube')->watch('default')->reserve(); // reserver是获取ready的job
$pheanstalk->ignore('default');//忽略管道
//处理代码
if ($job->getData() == 'one') {
sleep(2);// 超时重回队列3秒,睡眠两秒,delete之前的代码还能执行1秒,如果想在加
$pheanstalk->watch('mytube')->touch($job);//续命
}
具体对队列和任务的操作可以结合实际逻辑和设置任务和管道的状态。
参考:https://www.jianshu.com/p/82c4c6fee450
beanstalkd队列的更多相关文章
- 【转】Beanstalkd 队列简易使用
Beanstalkd一个高性能分布式内存队列系统 之前在微博上调查过大家正在使用的分布式内存队列系统,反馈有Memcacheq,Fqueue, RabbitMQ, Beanstalkd以及link ...
- 安装beanstalkd队列问题——No package beanstalkd available
CentOS7.4安装beanstalkd 时无可用源 No package beanstalkd availableError:Nothing to do 可从以下获取:wget /etc/yum. ...
- yii2.0 中的队列
a yii2 extension to make simple to use queue. yii2-queue让队列的使用在yii2中变得更轻松,她为各种队列组件的使用提供了一个标准的接口,您只需要 ...
- Beanstalkd一个高性能分布式内存队列系统
高性能离不开异步,异步离不开队列,内部是Producer-Consumer模型的原理. 设计中的核心概念: job:一个需要异步处理的任务,是beanstalkd中得基本单元,需要放在一个tube中: ...
- beanstalkd 消息队列
概况:Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Faceb ...
- 轻量级队列beanstalkd
一.基本Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Face ...
- 高性能分布式内存队列系统beanstalkd(转)
beanstalkd一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Facebook ...
- 使用Beanstalkd实现队列
Beanstalkd可以想象成缓存当中的memcahe或者redise,将我们的队列任务放到内存中进行管理. 运行环境是在linux中,反正我的windows中没运行成功.../(ㄒoㄒ)/~~ 首先 ...
- Beanstalkd 一个高性能分布式内存队列系统
需要一个分布式内存队列,能支持这些特性:任务不重不漏的分发给消费者(最基础的).分布式多点部署.任务持久化.批量处理.错误重试..... 转载:http://rdc.taobao.com/blog/c ...
随机推荐
- Idea 隐藏不必要的文件或文件夹 eg:(.idea,.gitignore,*.iml)
在使用Idea的时候,有一些文件是不必要的,可以将他们隐藏起来 方法:打开File–>Settings–>Editor如图,在File Types 中的 Ignore files and ...
- java中关于&0xFF 的问题
最近遇到一个问题,半天也没想明白,byte temp = 0xA0,为什么System.out.println(temp),打印的值为:-96:而System.out.println(temp& ...
- netty集成springboot
一 前言 springboot 如何集成netty实现mapper调用不为null的问题让好多读者都头疼过,知识追寻者发了一点时间做了个基本入门集成应用给读者们指明条正确的集成方式,我相信,只要你有n ...
- 最全Python学习路线图【2020最新版】
2020年最新的python学习大纲,专为python高薪打造另外很多人在学习Python的过程中,往往因为没有好的教程或者没人指导从而导致自己容易放弃,为此我建了个Python交流.裙 :一久武其而 ...
- 【快学SpringBoot】SpringBoot+Docker构建、运行、部署应用
前言 Docker技术发展为当前流行的微服务提供了更加便利的环境,使用SpringBoot+Docker部署和发布应用,其实也是一件比较简单的事情.当前,前提是得有Docker的基础. 源码在文末 文 ...
- SQL SERVER 2005还原差异备份、日志备份 2012-03-29 11:43
其实要备份,还原最安全最有保障的是完全备份.但是完全备份肯定是需要更多的磁盘空间的开销.尤其是数据量比较大的.比如基数是500M,每天的增长量为10M,那么第一次完全备份是500M,第二次是510M, ...
- python批量提取哔哩哔哩bilibili视频
# -*- coding: utf-8 -*- """ Created on Tue Jan 29 13:26:41 2019 @author: kwy "&q ...
- CODE 大全网站整站源码分享(带数据库)
CODE 大全是一个偏向于 JavaEE.JavaWeb,WEB 前端,HTML5,数据库,系统运维,编程技术开发的纯个人学习.交流性质的技术博客,一个很不错的网站,现在我免费分享给大家.对 java ...
- 【转载】使用阿里云code和git管理项目
使用代码云托管和git来管理项目可以使多客户端和多人开发更加高效.通过对比github,bitbucket和国内一些云托管服务发现阿里云在项目空间和传输速度及稳定性上更能满足公司开发的要求.本文将介绍 ...
- 使用mvn deploy命令将本地jar包上传到maven私服
记录一下,以后少走弯路 前提:已经搭建好nexus maven私服,地址192.168.110.240:9091 在maven的setting.xml中找到<mirrors></mi ...