Redis リスト データ型を使用してさまざまなデータ構造を実装できます。これは、PHP のインデックス配列とみなすことができます。スタック、キュー、メッセージ キューなどのさまざまなデータ構造を実装できます。今回はredisを使ってシステムログを保存する方法と人気記事一覧を紹介します。
ログの保存
ご存じのとおり、nginx ログはデフォルトでは自動的にカットされず、常にファイルに保存されます。丸太の伐採作業は自分たちで行う必要があります。 nginx 以外にもログはさまざまな場所で使用されます。何か問題が発生した場合、ログは手がかりを探す主な方法の 1 つです。
システム ログを Redis に書き込む予定です。単一のログ ファイルが大きくなりすぎないように、毎日のログがリストに記録されます。
基本的な考え方は、毎日のログ情報を別のリストに書き込んでから、スケジュールされたタスクを実行することです。スケジュールされたタスクの機能は、1 か月前のログ リストを取り出して永続化することです。 . をテキスト ファイルに保存し、redis がメモリを占有しすぎるのを防ぐために、redis 内の 1 か月前のログ リストを削除します。
圧縮機能を使用すると、ログ情報を圧縮し、メモリ使用量を削減できます。さらに、ログ リストのキー名を簡単に取得できるように、ログ リストのキー名を保存するリストを維持します。ログを保存するための疑似コードは次のとおりです:
$log = ... // 日志信息 // 日志列表键名 $key = 'log:'.strtotime(date('Y-m-d')); // 维护一个键名列表 if (!$redis->exists($key)) { $listlogkey = 'log:key'; $redis->rpush($listlogkey, $key); } // 日志信息存放到redis中 $redis->rpush($key, $log);
スケジュールされたタスクのコードは次のとおりです:
$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; } }
ここで注意すべき点がいくつかあります。過去 1 か月以内のログの場合は、ログ リストのキー名を左から再プッシュする必要があります。また、ログ リストからログを取得する場合は、Redis のブロックが発生しやすくなる可能性があるため、すべてを一度に取得しないでください。毎回、特定の数(50 個など)を取り出し、ループ状に取り出します。
人気ニュース ID の保存
ここではコードを投稿しませんが、主にアイデアについて説明します。今日の一番暑い、一番暑い週、1月の一番暑いなどのメニュー機能を持ったシステムを作成していました。当時、私たちのウェブサイトにはかなりのトラフィックがあったのですが、数日以内にウェブサイトがダウンしてしまいました。理由は、mysql のクエリが遅いという問題です。この SQL にはグループ化、COUNT()、条件判断などが含まれるためです。
私たちの解決策についてお話しましょう。mysql ストアド プロシージャを作成し、そのストアド プロシージャを定期的に呼び出します。このストアド プロシージャの機能は、今日、今週、および 1 月に最も人気のある記事をフィルターで除外し、それぞれ 100 個の記事 ID を取得し、その記事 ID を Redis キューに保存することです。人気のある記事については、上位 100 件のみを表示します。このようにして、私たちのシステムには遅いクエリはなくなります。
以上がRedis はログと人気記事を保存しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。