php+redis消息队列是php+mysql性能不足时的一个中间间处理方案。
应用场景:
用于服务器瞬间请求大,数据库压力大的情况。
如并发量大导致的超卖、并发量大导致的数据重复情况。
优点:
1、保证数据的可用性和准确性。
2、把服务器瞬间的请求处理转换成异步处理,缓解服务器的压力。
3、实现数据单条按顺序排列获取。
流程:
1、php接受请求和数据
2、php把数据写入redis队列中(入队)【函数rpush】
3、 shellj脚本定时调用php读取队列数据写入mysql(出队)【函数lpop】
4、查看队列中的当前数据【函数lrange】
入队:inqueue.php
/**
* 把请求数据写入redis队列中(入队)
*/
public function inqueue()
{
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$password = '';
$redis->auth($password);
//这里可以是GET或POST请求过来的数据
//$json = htmlspecialchars_decode($_POST["data"]); //GET或POST请求过来的数据
$json = '[{"username":"张三","course":"语文","score":145},{"username":"李四","course":"数学","score":149},{"username":"王五","course":"英语","score":147}]';
$arr = json_decode($json, true);
foreach ($arr as $k => $v) {
$redis->rpush("myqueue", json_encode($v));
}
}
出队:outqueue.php
/**
* 读取队列数据写入mysql(出队)
*/
public function outqueue()
{
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$password = '';
$redis->auth($password);
//list类型出队操作
$value = $redis->lpop('myqueue');
if ($value) {
// $myarr = json_decode($value, true);
// if ($myarr) {
// Db::execute("INSERT INTO `student` (username, course, score) VALUES ('" . $myarr["username"] . "','" . $myarr["course"] . "'," . $myarr["score"] . ")");
// }
echo "出队的值" . $value;
} else {
echo "出队完成";
}
}
shell process.sh:定时调用outqueue.php
#每分钟调用一次
*/1 * * * * /usr/local/nginx/wwwroot/process.sh
#process.sh
php /usr/local/nginx/wwwroot/outqueue.php
#每分钟调用多次
*/1 * * * * /usr/local/nginx/wwwroot/process.sh
#process.sh
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
php /usr/local/nginx/wwwroot/outqueue.php
查看队列中的当前数据:
/**
* 查看队列中的当前数据
*/
public function lookqueue()
{
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$password = '';
$redis->auth($password);
$list = $redis->lrange('myqueue', 0, -1);
var_dump($list);
}