[高同時実行性のシンプルなソリューション] redis キャッシュ キュー + mysql バッチ ストレージ + php オフライン統合
要件の背景: 統計ログ ストレージと統計を呼び出す需要があり、これには mysql 内のストレージが必要です。保存されるデータのピーク値は 1 日に数千万に達する可能性があり、直接ストレージの同時実行性がボトルネックとなります。高すぎると、mysql がダウンする可能性があります。
問題分析
思考: アプリケーション Web サイトのアーキテクチャの進化の過程では、最新のフレームワークとツール技術を適用することが確かに最良の選択ですが、既存のフレームワークに基づいてシンプルで信頼性の高いソリューションを提案できるのであれば、おそらくそれが最善の選択です。自分自身を改善しようとする試み。解決策:
- 問題 1: ログをデータベースに保存する必要がありますが、mysql はデータベースへの直接ログインを処理できません。データベースへのバッチ ログインには問題ありません。 [バッチ ウェアハウスとダイレクト ウェアハウスのパフォーマンスの違いに関する参考記事]
- 質問 2: バッチ ウェアハウスは同時実行性の高いメッセージ キューを必要とするため、ロールバックが簡単な Redis リスト シミュレーションを使用して実装することにしました。
- 質問 3: 結局ログの量が膨大なので、最新の 30 エントリを保存するだけで十分であると考え、PHP でオフライン統計とクリーニング スクリプトを作成することにしました。
完了しました。以下は Xiaoyan の簡単な実装プロセスです
1: データベースのテーブルとストレージを設計します
- データベースのパフォーマンスはログ システムの方が高く、安定性とセキュリティはそれほど高くないことを考慮すると、ストレージ エンジンは当然のことながら、インデックスなしの選択挿入アーカイブのみをサポートします。本当に更新する必要がある場合は、myISAM を使用することもできます。
- ログはすべてリアルタイムに記録されたデータであり、その量が膨大になる可能性があることを考慮して、主キーはbigintを使用し、単独でインクリメントできるようにしています。
- ログ システムが主に書き込まれることを考慮すると、統計はオフラインで計算され、データ挿入の効率に影響を与える可能性があり、デッドロックが発生する可能性があるため、フィールドにインデックスを表示すべきではありません。読み取り中はデータの書き込みに影響します。
2 つ: Redis はデータを保存してメッセージ キューを形成します
同時実行性が高いため、コードはできるだけシンプルかつ直接的である必要があります。
connect('xx', 6379);$redis->auth("password");// 加上时间戳存入队列$now_time = date("Y-m-d H:i:s");$redis->rPush("call_log", $interface_info . "%" . $now_time);$redis->close();/* vim: set ts=4 sw=4 sts=4 tw=100 */?>
3: データは一定の間隔でバッチに保存されます。
Redis メッセージ キュー内のデータを定期的に読み取り、バッチで保存します。
connect('ip', port);$redis_xx->auth("password");// 获取现有消息队列的长度$count = 0;$max = $redis_xx->lLen("call_log");// 获取消息队列的内容,拼接sql$insert_sql = "insert into fb_call_log (`interface_name`, `createtime`) values ";// 回滚数组$roll_back_arr = array();while ($count lPop("call_log"); $roll_back_arr = $log_info; if ($log_info == 'nil' || !isset($log_info)) { $insert_sql .= ";"; break; } // 切割出时间和info $log_info_arr = explode("%",$log_info); $insert_sql .= " ('".$log_info_arr[0]."','".$log_info_arr[1]."'),"; $count++;}// 判定存在数据,批量入库if ($count != 0) { $link_2004 = mysql_connect('ip:port', 'user', 'password'); if (!$link_2004) { die("Could not connect:" . mysql_error()); } $crowd_db = mysql_select_db('fb_log', $link_2004); $insert_sql = rtrim($insert_sql,",").";"; $res = mysql_query($insert_sql); // 输出入库log和入库结果; echo date("Y-m-d H:i:s")."insert ".$count." log info result:"; echo json_encode($res); echo "n"; // 数据库插入失败回滚 if(!$res){ foreach($roll_back_arr as $k){ $redis_xx->rPush("call_log", $k); } } // 释放连接 mysql_free_result($res); mysql_close($link_2004);}// 释放redis$redis_cq01->close();?>
4: オフラインの日レベルの統計とデータ スクリプトのクリーニング
?php/*** static log :每天离线统计代码日志和删除五天前的日志** @Author:cuihuan@baidu.com* 2015-11-06* */// 离线统计$link_2004 = mysql_connect('ip:port', 'user', 'pwd');if (!$link_2004) { die("Could not connect:" . mysql_error());}$crowd_db = mysql_select_db('fb_log', $link_2004);// 统计昨天的数据$day_time = date("Y-m-d", time() - 60 * 60 * 24 * 1);$static_sql = "get sql";$res = mysql_query($static_sql, $link_2004);// 获取结果入库略// 清理15天之前的数据$before_15_day = date("Y-m-d", time() - 60 * 60 * 24 * 15);$delete_sql = "delete from xxx where createtime
5: コードのデプロイメント
主にデプロイメント、バッチ ウェアハウス スクリプトと日レベルの統計スクリプトの呼び出し、crontab ルーチンの実行。
# 批量入库脚本*/2 * * * * /home/cuihuan/xxx/lamp/php5/bin/php /home/cuihuan/xxx/batchLog.php >>/home/cuihuan/xxx/batchlog.log# 天级统计脚本0 5 * * * /home/cuihuan/xxx/php5/bin/php /home/cuihuan/xxx/staticLog.php >>/home/cuihuan/xxx/staticLog.log
要約: 高い同時実行性に対処する他の複雑な方法と比較して、このソリューションはシンプルで効果的です。プレッシャーに耐えるために Redis キャッシュを使用し、データベースのボトルネックを解決するために mysql バッチ ウェアハウスを使用し、統計データを解決するためにオフライン計算を使用し、ライブラリのサイズを確保します。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











多くの場合、キーワードと追跡パラメーターで散らかった長いURLは、訪問者を阻止できます。 URL短縮スクリプトはソリューションを提供し、ソーシャルメディアやその他のプラットフォームに最適な簡潔なリンクを作成します。 これらのスクリプトは、個々のWebサイトにとって価値があります

Laravelは、直感的なフラッシュメソッドを使用して、一時的なセッションデータの処理を簡素化します。これは、アプリケーション内に簡単なメッセージ、アラート、または通知を表示するのに最適です。 データは、デフォルトで次の要求のためにのみ持続します。 $リクエスト -

これは、LaravelバックエンドとのReactアプリケーションの構築に関するシリーズの2番目と最終部分です。シリーズの最初の部分では、基本的な製品上場アプリケーションのためにLaravelを使用してRESTFUL APIを作成しました。このチュートリアルでは、開発者になります

Laravelは簡潔なHTTP応答シミュレーション構文を提供し、HTTP相互作用テストを簡素化します。このアプローチは、テストシミュレーションをより直感的にしながら、コード冗長性を大幅に削減します。 基本的な実装は、さまざまな応答タイプのショートカットを提供します。 Illuminate \ support \ facades \ httpを使用します。 http :: fake([[ 'google.com' => 'hello world'、 'github.com' => ['foo' => 'bar']、 'forge.laravel.com' =>

PHPクライアントURL(CURL)拡張機能は、開発者にとって強力なツールであり、リモートサーバーやREST APIとのシームレスな対話を可能にします。尊敬されるマルチプロトコルファイル転送ライブラリであるLibcurlを活用することにより、PHP Curlは効率的なexecuを促進します

顧客の最も差し迫った問題にリアルタイムでインスタントソリューションを提供したいですか? ライブチャットを使用すると、顧客とのリアルタイムな会話を行い、すぐに問題を解決できます。それはあなたがあなたのカスタムにより速いサービスを提供することを可能にします

2025 PHP Landscape Surveyは、現在のPHP開発動向を調査しています。 開発者や企業に洞察を提供することを目的とした、フレームワークの使用、展開方法、および課題を調査します。 この調査では、現代のPHP Versioの成長が予想されています

この記事では、Laravel Webフレームワークの通知システムを検討します。 Laravelの通知システムを使用すると、さまざまなチャネルでユーザーに通知を送信できます。今日は、通知ovを送信する方法について説明します
