当前位置:首页 » 编程语言 » redis队列php

redis队列php

发布时间: 2022-05-06 10:38:30

1. php 后台怎么开一个进程监听Redis的队列消息呢用while

redis的subscribe用pconnect链接,执行这个脚本的进程会自动监听所订阅的频道发送的消息

ini_set(‘default_socket_timeout’, -1);

$redis = new \Redis();
$redis->pconnect('127.0.0.1', 6379);

//订阅
$redis->subscribe(['msg'], 'callfun');

function callfun($redis, $channel, $msg)
{
var_mp([
'redis' => $redis,
'channel' => $channel,
'msg' => $msg
]);
}

2. 如何使用Redis 做队列操作

  • redis设计用来做缓存的,但是由于它自身的某种特性使得它可以用来做消息队列,它有几个阻塞式的API可以使用,正是这些阻塞式的API让其有能力做消息队列;

  • 另外,做消息队列的其他特性例如FIFO(先入先出)也很容易实现,只需要一个list对象从头取数据,从尾部塞数据即可;

  • redis能做消息队列还得益于其list对象blpop brpop接口以及Pub/Sub(发布/订阅)的某些接口,它们都是阻塞版的,所以可以用来做消息队列。

3. php怎么实现redis阻塞队列

具体的业务还是得需要你自己定制。你的需求实际上是一个变形的生产者-消费者实现。对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系。一般的实现方法是你需要将用户的请求封装成一个Task,然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理Task并将处理结果回调给请求方。这里唯一麻烦点的就是这个Task的设计,需要能够包含请求信息(请求内容,请求方标识等等).

4. 请教PHP+Redis实现任务队列的思路

// 创建请求ID标志, uniqid 无法保证唯一, 自己去搜索生成唯一的方法
$uuid = uniqid();
$tsk_name = "mytask";
$time_out = 30000; // 超时策略: 30秒
$time_start = time();
$redis->rPush($tsk_name, $uuid); // 右(后)插入队列

// 堵塞等待队列中第一个和$uuid匹配的(到我了)
while($uuid != $redis->lGet($tsk_name, 0)){
if((time()-$time_start)> $time_out) {
break; // 超时跳出(某些原因队列异常了, 可能永远取不到)
}
usleep(10); // sleep 10ms, 再次尝试
}

// 这里执行任务的处理代码....

// $response 已拼装好要返回的内容
// 处理完成后(数据库等已入库更新), 需要:
if($redis->lGet($tsk_name, 0) == $uuid){ // 再次确认第一个是本请求
$redis->lPop($tsk_name); // 完成任务了, 从队列中移除
}else{
// 出现这种情况, 是因为超时了, 或前面的$uuid没有被消费
// 若不清除, 后续的请求, 都将无法正常进入队列执行
// 取队列中的所有$uuid
$queues = $redis->lRange($tsk_name, 0, -1);
foreach($queues as $i=>$uid){
if($uid==$uuid){

5. 如何正确使用redis队列处理php秒杀并发问题

1. redis中保存的是数组(序列化),绝对不要保存sql,保存SQL的方法很蛋疼 保存数组是为了数据库安全(万一sql语句有错误,任务就直接失败了),灵活度和兼容性
2.服务器后台作一个shell脚本,死循环,不断从队列中取数据,进行处理.如次反复,如果没有数据,也立即尝试取数据---不要担心性能问题,后台单并发请求,不会造成性能问题
3.因为队列中保存的是数组,不存在这个问题

6. php redis 消息队列 一次出多少个队列

方法如下:
[php] view plain print?

$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
while(1){
try{
$value = "value_".time();
$redis->LPUSH('key1', $value);
echo $value."\n";
sleep(rand(1, 3));
}catch(Exception $e){
echo $e->getMessage(). "\n";
exit;
}
}

热点内容
乘法多种算法 发布:2024-05-10 12:26:44 浏览:780
ps2021怎么存储为web格式 发布:2024-05-10 12:26:41 浏览:663
苹果手机怎么清理其他内存和缓存 发布:2024-05-10 12:26:40 浏览:628
白车黑顶xc40是哪个配置 发布:2024-05-10 12:15:53 浏览:536
没有设密码格式不正确是什么意思 发布:2024-05-10 12:15:50 浏览:807
存储系统Ceph 发布:2024-05-10 12:02:02 浏览:295
linux是几位 发布:2024-05-10 11:32:53 浏览:877
虎牙直播安卓投屏用什么软件 发布:2024-05-10 11:31:30 浏览:835
桃源码头电话 发布:2024-05-10 11:27:44 浏览:72
编译器连接地址是内存地址 发布:2024-05-10 11:16:34 浏览:524