很多站长朋友们都不太清楚php+rpush,今天小编就来给大家整理php+rpush,希望对各位有所帮助,具体内容如下:
本文目录一览: 1、 消息队列为什么用redis实现 2、 如何把python程序转化为php程序?? 3、 php实现redis数据库指定库号迁移的方法 4、 php redis高并发rpush是数据一致性吗 5、 请教PHP+Redis实现任务队列的思路 6、 php 用 redis做队列 运行过程是什么样的 消息队列为什么用redis实现redis只是提供一个高性能的、原子操作的分布式队列实现。具体的业务还是得需要你自己定制。
你的需求实际上是一个变形的生产者-消费者实现。对于此类需求,主要是将请求和实际的处理过程解耦,一般都是采取异步的方式来通知请求方,这跟用不用redis其实没有多大的关系。一般的实现方法是你需要将用户的请求封装成一个Task,然后将这个Task再push到redis队列,然后后端的worker.php完全可以多进程、多线程的并发处理Task并将处理结果回调给请求方。这里唯一麻烦点的就是这个Task的设计,需要能够包含请求信息(请求内容,请求方标识等等).
如何把python程序转化为php程序??<?php
class FrogCrossRiver{
var $cur = array();
var $end = array();
function getPossibleMove($cur){
$lst = array();
$zeroIdx = array_search(0,$cur);
if ($zeroIdx-1>=0 $cur[$zeroIdx-1]==1){ #left 1
$lst[$zeroIdx-1] = 1;
}
if ($zeroIdx-2>=0 $cur[$zeroIdx-2]==1){ # left 2
$lst[$zeroIdx-2] = 2;
}
if ($zeroIdx+1<=6 $cur[$zeroIdx+1]==2){ # right 1
$lst[$zeroIdx+1] = -1;
}
if ($zeroIdx+2<=6 $cur[$zeroIdx+2]==2){ # right 2
$lst[$zeroIdx+2] = -2;
}
return $lst;
}
function printStep($myStep){
$tmp = $this->cur;
echo "===========================<br/>";
foreach ($myStep as $v){
foreach ($v as $idx => $mv){
$tt = $tmp[$idx];
$tmp[$idx] = $tmp[$idx + $mv];
$tmp[$idx+$mv] = $tt;
echo "cur[{$idx}] move {$mv} <br/>";
echo " [" . implode(',', $tmp) . "]<br/>";
}
}
echo "===========================<br/>";
}
function jump($cur,$myStep){
#print_r($cur); echo "<br/>";
if (array_intersect($cur, $this->end)==$this->end){
$this->printStep($myStep);
return;
}
$lst = $this->getPossibleMove($cur);
foreach ($lst as $idx => $mv){
$newCur = $cur;
$newMyStep = $myStep;
$newMyStep[] = array($idx=>$mv);
$tt = $newCur[$idx];
$newCur[$idx] = $newCur[$idx + $mv];
$newCur[$idx+$mv] = $tt;
$this->jump($newCur,$newMyStep);
}
}
function doit(){
$this->cur = array(1,1,1,0,2,2,2);
$this->end = array(2,2,2,0,1,1,1);
$this->jump($this->cur, array());
}
}
# Start
$f = new FrogCrossRiver();
$f->doit();
?>
这样就可以了,在php网页的环境下执行即可看到和python一样的输出效果。
php实现redis数据库指定库号迁移的方法这篇文章主要介绍了php实现redis数据库指定库号迁移的方法,涉及对于redis数据库的操作技巧,非常具有实用价值,需要的朋友可以参考下
本文实例讲述了php实现redis数据库指定库号迁移的方法,分享给大家供大家参考。具体如下:
redis普通的数据库迁移,只能整个redis
save,或者利用主从,当然也可以安装一个redis-dump,不过比较麻烦,这里提供一种php的脚本,实现指定库号的迁移,其实也就是遍历根据存储类型,读出来,插入新库,效果是这样:
代码如下:
[root@localhost
~]#
php
1.php
1/407
101/407
201/407
301/407
401/407
PHP实例代码如下:
代码如下:
<?php
$from
=
'10.0.2.52:6379/7';
$to
=
'127.0.0.1:6379/7';
$from_redis
=
redis_init($from);
$to_redis
=
redis_init($to);
$keys
=
$from_redis->keys('*');
$count
=
0;
$total
=
count($keys);
foreach($keys
as
$key){
if(++$count
%
100
==
1){
echo
"$count/$totaln";
}
$type
=
$from_redis->type($key);
switch($type){
case
Redis::REDIS_STRING:
$val
=
$from_redis->get($key);
$to_redis->set($key,
$val);
break;
case
Redis::REDIS_LIST:
$list
=
$from_redis->lRange($key,
0,
-1);
foreach($list
as
$val){
$to_redis->rPush($key,
$val);
}
break;
case
Redis::REDIS_HASH:
$hash
=
$from_redis->hGetAll($key);
$to_redis->hMSet($key,
$hash);
break;
case
Redis::REDIS_ZSET:
$zset
=
$from_redis->zRange($key,
0,
-1,
true);
foreach($zset
as
$val=>$score){
$to_redis->zAdd($key,
$score,
$val);
}
break;
}
}
function
redis_init($conf){
$redis
=
new
Redis();
preg_match('/^([^:]+)(:[0-9]+)?/(.+)?/',
$conf,
$ms);
$host
=
$ms[1];
$port
=
trim($ms[2],
':');
$db
=
$ms[3];
$redis->connect($host,
$port);
$redis->select($db);
return
$redis;
}
?>
希望本文所述对大家的php程序设计有所帮助。
php redis高并发rpush是数据一致性吗不会,这里的原子性不要从php的角度看,应该从redis的角度看,同一个redis节点对并发的请求都是序列化处理的,所以单操作不存在你担心的并发问题,但如果是read write的形式到哪里都不行了,切记。
有人问到read write是啥,其实就是并发的一个经典问题,代码如下
$v = $redisClient->get('v');
$v ++;
$redisClient->set('v', $v);
就是先读取数据,再修改数据,在写回修改,这里是希望每次访问都递增v的值,但在并发情况下,两个进程都读取到了一样的初始值,比如3,然后都加1变为4,最后把4写回Redis,这种情况就会统计数据比实际的少。尽量都用Redis的原子操作就好,比如incr。
请教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){
php 用 redis做队列 运行过程是什么样的redis实现消息队列很简单:
$this->redis->rPush($key, $val); // 右边入
$this->redis->lPop($key); // 左边出
关于php+rpush的介绍到此就结束了,不知道本篇文章是否对您有帮助呢?如果你还想了解更多此类信息,记得收藏关注本站,我们会不定期更新哦。