为了降低由于高并发导致的对数据库的频繁读取,采用redis队列的方式可以解决。
先安装redis,然后再到php拓展里打开redis组件
简单使用:
set和get的使用,简单存储和取出操作
<?php
//连接本地的 Redis 服务
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "服务器连接成功";
//设置 redis 字符串数据
$redis->set("webname", "www.biancheng.net");
// 获取存储的数据并输出
echo "获取网站名: " . $redis->get("webname");
?>
也可以存入json格式,取的时候再转换
<?php
//Redis初始化类
if(extension_loaded('redis')) {
$redis = new Redis();
$redis->connect("127.0.0.1", "6379");
$redis->auth("");
$redis->select(1); //选择 6号库
$value = array(
"id" =>1,
"name"=>"test1",
"age" =>15
);
$json = json_encode($value, JSON_UNESCAPED_UNICODE);//转为字符串
$redis->set("test_val", $json);//存入
//取数据,重点:注意键值
$resuilt=$redis->get("test_val);//取值
$resuilt=json_decode($resuilt,true);//转换
echo $resuilt['name'];
}else{
echo "没有安装Redis扩展";
}
队列,Rpush与Lpop,取数据的规则,先存储的数据,先取出来(先进先出)并且移除取出的数据在Redis的存储(取出一条数据就删除这条的存储)
<?php
//Redis初始化类
if(extension_loaded('redis')) {
$redis = new Redis();
$redis->connect("127.0.0.1", "6379");
$redis->auth("");
$redis->select(5); //选择 5号库
$value = array(
"id" =>2,
"name"=>"test",
"age" =>22
);
$json = json_encode($value, JSON_UNESCAPED_UNICODE);
$redis->rPush("test_key", $json); //RPUSH 键值
//lPop取出数据,先入先出
var_dump($redis->lPop("test_key"));
}else{
echo "没有安装Redis扩展";
}
处理队列
<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->select(5); //选择 5号库
echo '<br>执行开始'.$send_time=date("Y-m-d H:i:s");
while($redis->llen('sms_line')>0){//如果队列中有数据,则取出一条,否则终止线程
$one_data=$redis->lPop("sms_line");//取出一条数据,先入先出
$one_data=json_decode($one_data,true);//转换
//模拟发送sms
$phone=$one_data['phone'];
sleep(1);//模拟发送时间1s
}
echo '<br>执行完毕'.$send_time=date("Y-m-d H:i:s");
exit;