对标Driver
表,存储位置:\app\uml\Driver.php
:
namespace app\uml;
use x\redis\UML;
class Driver extends UML
{
/**
* 使用的Redis连接池标识
*/
protected $driver = 'default';
/**
* 使用哪个Redis表存储
*/
protected $database = 12;
/**
* 是否开启回写记录
*/
protected $timer = true;
/**
* 主键字段
*/
protected $primary = 'id';
/**
* 建模必传对象
*/
protected $field_rule = [
'id', // 主键值
'driver_sn', // 编号
'status', // 状态 1.在线空闲 2.在线工作中 3.离线
'region_id', // 地区ID
'real_name', // 真实姓名
'lng', // 经度
'lat', // 纬度
'add_time', // 添加时间
];
/**
* 普通查询规则
*/
protected $query_rule = [
'id' => ['equal'], // 等于查询
'status' => ['equal'], // 等于查询
'region_id' => ['equal', 'range'], // 等于查询 OR 范围查询
'driver_sn' => ['equal'], // 等于查询
'real_name' => ['equal'], // 等于查询
'add_time' => ['range'], // 日期查询
];
/**
* geo配置规则
*/
protected $geo_rule = [
'longitude' => 'lng', // 经度
'latitude' => 'lat', // 纬度
];
}
HTTP控制器:
namespace app\http;
use x\controller\Http;
use app\uml\Driver;
class Index extends Http
{
/**
* @RequestMapping(route="/test1")
*/
public function index() {
// 生成随机数据
$all = [];
$time = time();
// 10W测试
for ($i=0; $i<=100000; $i++) {
$all[] = [
'id' => ($i+1),
'status' => rand(1, 3),
'driver_sn' => substr(md5($i), 0, 2).$i,
'region_id' => rand(100, 200),
'real_name' => \x\built\Str::randChinese(),
'lng' => \x\common\Money::randomFloat(113.100000, 116.999999, 6),
'lat' => \x\common\Money::randomFloat(23.100000, 25.999999, 6),
'add_time' => $time+$i,
];
}
$Driver = new Driver();
$num = $Driver->insertAll($all, 5000);
return $this->fetch($num);
}
}
建议:测试上面脚本用的3核+8G
的机器,如果配置更差的同学记得自己修改测试量,不要逞强。
HTTP控制器:
namespace app\http;
use x\controller\Http;
use app\uml\Driver;
class Index extends Http
{
/**
* @RequestMapping(route="/test2")
*/
public function index() {
$html = '';
// 统计耗时
$StartTime = microtime(true);
$Driver = new Driver();
// 查询ID等于3的数据
$info = $Driver->id(3)->find();
$html .= '场景一:'.dd($info);
// 将其修改为工作中
$res = $Driver->id(3)->update([
'status' => 2
]);
$html .= '场景二:'.dd($res);
// 查询在线,并且地区在150的司机
$list = $Driver->where('status', [1, 2])->where('region_id', 150)->select();
$html .= '场景三:'.dd(count($list));
// 查询在线,并且地区在150,同时要是姓林的司机
$list = $Driver->where('status', [1, 2])->where('region_id', 150)->like('real_name', '林', '%s')->select();
$html .= '场景四:'.dd(count($list));
// 查询在线,并且在geo半径5公里内,地区在100 - 120 之间的司机
$list = $Driver->geo(113.402618, 23.149329, 5)->where('status', [1, 2])->where('region_id', 'range', [100, 120])->select();
$html .= '场景五:'.dd(count($list));
$StopTime = microtime(true);
$TimeSpent=$StopTime-$StartTime;
$html .= dd('上述查询总耗时:'.number_format($TimeSpent*1000, 4).'毫秒');
return $this->fetch($html);
}
}
耗时结果: