Redis作为消息队列的优势在于轻量级、高并发、延迟敏感。应用场景包括实时数据分析、秒杀计数器、缓存等。Redis作为消息队列需要解决的问题:1、消息的可靠性:没有相应的机制来保证消息的消费。当消费者消费失败时,消息体丢失,需要手动处理。生产者只向队列中插入数据,而不管消费者是否消费成功。2、消费者挂掉消息不会丢失,但需要重新触发消费者继续消费消息。代码如下:lib.php是一个工具文件,里面包含了数据库连接和Redis连接:connect($host,$port)){die("Redis连接失败:IP或端口错误");}if(!empty($password)&&!$redis->auth($password)){die("Redis连接失败:密码错误");}if($database){$redis->select($database);}//subscribeinwork如果一段时间没有收到消息,就会停止Drop,然后停止,所以加上这条语句让它永不超时$redis->setOption(Redis::OPT_READ_TIMEOUT,-1);return$redis;}/***打印消息日志**@param$msg*/functionstdout($msg=null){$msg='['.date('Y-m-dH:i:s').']'.$msg.chr(10);;fwrite(STDOUT,$msg);}register.php是消息发布者,comment是将消息存入数据库的代码 。首先,它要将消息存储在register_users队列中。存储的key是register_users;该值是一个列表,所有消息都存储在其中。用redis-cli查看数据的命令是:LRANGEregister_users0-1register.php:error);//}$redis=getRedis();//添加消息$result=$redis->lpush('register_users',json_encode(array('name'=>$name,'mobile'=>$mobile),JSON_UNESCAPED_UNICODE));if($result===false){mysqli_rollback($connection);die("AddmessageQueuefailed");}//发布消息$redis->publish('register_success','ok');//所有操作完成后提交事务//mysqli_commit($connection);//$connection->close();$redis->close();work.php作为消息消费者subscribe(['register_success'],功能($instance,$channelName,$message){if($channelName=="register_success"&&$message="ok"){$redis=getRedis();while($redis->lsize("register_users")>0){$arr=$redis->brPop(['register_users'],20);if(count($arr)){$userInfo=json_decode($arr[1],true);stdout("新注册用户信息:");stdout("姓名:".$userInfo['姓名']);stdout("手机号:".$userInfo['mobile']);标准输出();睡觉(3);}}}});register.php将消息放入redis的register_users队列中,然后使用publish发出register_success消息。work.php使用subscribe来订阅register_success消息。收到register_success消息后,读取register_users消息进行处理。
