0

0

Redis存放日志及热门文章

齐天大圣

齐天大圣

发布时间:2020-05-12 08:32:43

|

2070人浏览过

|

来源于php中文网

原创

使用redis的列表数据类型可以实现多种数据结构,可以将它看做php中的索引数组。它可以实现栈、队列、消息队列的多种数据结构。今天,和大家介绍下,如何使用redis来保存系统日志及热门文章列表。

存放日志

大家知道,nginx日志默认不会自动切割,它会一直存放一个文件中,一直追加写入,需要我们自己做切割日志的操作。除了nginx外,很多地方都有用到日志。出了问题后,日志是我们是我们查找线索的主要途径之一。

我们现在打算将系统的日志写入到redis中,每天的日志都记录到一个list列表中,可以防止单个日志文件过大。

基本思路是,每天的日志信息都写入到单独的list列表中,然后做定时任务,定时任务的功能是取出1个月前的日志列表,将其持久化到文本文件中,然后删除redis中1个月前的日志列表,防止redis占用过多内存。

可以使用压缩函数将日志信息压缩,减少内存占用。另外,再维护一个列表存日志列表的键名,方便取出日志列表键名。存放日志的伪代码如下:

$log = ... // 日志信息
// 日志列表键名
$key = 'log:'.strtotime(date('Y-m-d'));

// 维护一个键名列表
if (!$redis->exists($key)) {
 $listlogkey = 'log:key';
 $redis->rpush($listlogkey, $key);
}

// 日志信息存放到redis中
$redis->rpush($key, $log);

定时任务代码如下:

Glif
Glif

Glif.app 是一个有趣的AI沙盒工具,用于创建名为 glifs 的微型AI生成器,例如自拍生成器、Meme梗图、表情包、漫画、故事等

下载
$lastMonth = strtotime("-30 day");

while ($logkey =  $redis->lpop('log:key')) {
    $logTime = explode(':', $logkey)[1];
    
    if ($logTime < $lastMonth) {
        // 从日志列表里去日志信息,一次取50条
        for ($start = 0, $end = 49;true;$start +=50, $end+=50) {
            $logs = $redis->lrange($logkey, $start, $end);
            if (!$logs) break;
            // 将日志信息解压缩,然后追加写入文本文件中
             ……
             
            // 删除该日志列表
            $redis->del($logkey);
        }   
    } else {
        // 一个月之内的,重新push到左侧
        $redis->lpush('log:key', $logkey);
        exit;
    }
}

这里有几点需要注意,如果持久化日志失败后,或者是近一个月内的日志,需要重新将日志列表键名从左侧push。另外,从日志列表里取日志时,不要一次性全部取出,这样容易导致redis阻塞。每次,取一定数量(如50条),循环取出。

存放热门新闻ID

这里,就不贴代码了,主要讲讲思路。以前我弄个一个系统,有一个版单功能,有今日最热、一周最热、一月最热。当时,我们的网站流量还挺大的,过不了几天,网站就挂了。原因是,mysql的慢查询问题。因为,这块的sql有分组、COUNT()、条件判断等。

和大家说说我们的解决方案:写一个mysql的存储过程,定时调用存储过程。该存储过程的作用是,筛选出今日、一周、一月最热文章,分别取100条文章id,将其文章id存放到redis的队列中。最热文章,我们只展示前100条。这样,我们的系统就没有了慢查询了。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1857

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1226

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1120

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1398

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1229

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

俄罗斯搜索引擎Yandex最新官方入口网址
俄罗斯搜索引擎Yandex最新官方入口网址

Yandex官方入口网址是https://yandex.com;用户可通过网页端直连或移动端浏览器直接访问,无需登录即可使用搜索、图片、新闻、地图等全部基础功能,并支持多语种检索与静态资源精准筛选。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1

2025.12.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号