在日常开发中,我们一般都会做日志,邮件认证类服务。例如说日志,如果用户访问的日志都存入到业务数据库,或者写入到本地文件,会消耗不少的IO,会影响正常的系统性能,这个时候MQ就起到一个缓解服务器压力的作用,利用Redis 链表的数据类型可以实现一个简单的MQ,虽然没有ack机制,但是对日志处理已经足够了.实现思路如下
先做一个简单的服务类
<?php
/**
* @author jinanav 2020年1月13日16:40:38
* @desc 自定义Mq服务类
*/
class MqService
{
private static $redis = null;//redis操作对象
public function __construct(){
if (empty(self::$redis)) {
self::$redis = new \Redis();
self::$redis->connect('127.0.0.1', 6379, 5);
self::$redis->auth('testk');
}
}
/**
* 日志数据写入队列
* @param array $data 写入队列的消息
* @param string $queue 队列key名称 与日志表名相关联
* @return boolean
* @author jinanav 2020年1月17日15:05:06
*/
public static function enqueue($data, $queue = 'api_log'){
return !empty($data) ? self::$redis->lPush($queue, json_encode($data)) : false;
}
/**
* 读取队列数据
* @param string $queue 队列key名称
* @return array
* @author jinanav 2020年1月17日15:11:44
*/
public static function dequeue($queue = 'api_log'){
$info = self::$redis->rPop($queue);
return !empty($info) ? json_decode($info, true) : [];
}
/**
* 返回队列长度
* @param string $queue 队列key名称
* @return int
* @author jinanav 2020年1月17日17:23:32
*/
public static function queueLen($queue = 'th_api_view_log'){
return self::$redis->lLen($queue);
}
}
调用
#写入日志
new MqService();
//写入日志
$logData = array();
MqService::enqueue($logData);
//读取日志
while(MqService::queueLen()){
$value = MqService::dequeue();
//写入到数据库中
......
}
#如果不想用swoole等常驻内存扩展,可以配合crondtab每分钟执行一次读取日志脚本