PHP + Redis实现简单mq

在日常开发中,我们一般都会做日志,邮件认证类服务。例如说日志,如果用户访问的日志都存入到业务数据库,或者写入到本地文件,会消耗不少的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每分钟执行一次读取日志脚本
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 包含的重点内容:JAVA基础JVM 知识开源框架知识操作系统多线程TCP 与 HTTP架构设计与分布式算法数据库知...
    消失er阅读 4,567评论 1 10
  • 问题导读: 1.如何构建高并发电商平台架构 2.哈希、B树、倒排、bitmap的作用是什么? 3.作为软件工程师,...
    MaLiang阅读 5,271评论 1 70
  • 概念 Redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value内存数据库,...
    jiangmo阅读 726评论 0 3
  • 一、 设计理念 1.空间换时间 1)多级缓存,静态化 客户端页面缓存(http header中包含Expires/...
    帅T阅读 3,709评论 1 15
  • 高并发平台架构 设计理念 1. 空间换时间 多级缓存,静态化前端页面缓存(HTTP Header中包含Expire...
    AkaTBS阅读 3,093评论 0 13

友情链接更多精彩内容