インターネットの継続的な発展に伴い、Web サイトやアプリケーションでデータベースを使用することがますます一般的になりました。アプリケーションの開発および保守において、データのクエリは非常に重要なタスクであり、データを効率的にクエリして処理する方法は、開発者が直面する重要な問題となっています。この記事では、この問題を解決するために、PHP で重複しないデータ構造をクエリする方法を紹介します。
広告システムがあるとします。各広告には一意の ID 番号があり、異なるページに表示できます。特定のページに広告を表示したい場合、MySQL データベース内の広告データをクエリし、次の 3 つの条件に従って結果をフィルタリングできます。
1) 表示ステータス: 表示のみが「表示中」であるステータス付きの広告 (status=1)。
2) 表示確率: 各広告には表示確率(show_ratio)があり、その確率に基づいて広告を表示するかどうかが決定されます。
3) 重複表示の排除: 同じページに重複した広告を表示しません。
条件を満たす広告データを効率的にクエリするにはどうすればよいですか?これを完了するには、重複のない効率的なデータ構造が必要です。
上記のクエリ条件を満たすために、この記事では、Redis - HyperLogLog (HLL) に基づく非重複データ構造を紹介します。略して)、HLL は、データ セットのカーディナリティ、つまり個別の要素の数を効率的に推定できます。 HLLを利用することで、表示ステータスが「表示中」の広告数と条件を満たす表示確率を素早くカウントし、重複表示を排除することができます。
HLL は、一連のハッシュ関数を使用してデータ セットのカーディナリティを推定します。その実装原理はブルーム フィルターに似ていますが、エラー率はより低くなります。 Redis では、HLL タイプは、要素を追加するための pfadd コマンドと、カーディナリティを計算するための pfcount コマンドを提供します。以下は PHP コードの例です。
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->pfadd('ad', 'ad1', 'ad2', 'ad3'); // 添加广告 ID $redis->pfadd('ad', 'ad3', 'ad4', 'ad5'); // 添加广告 ID $count = $redis->pfcount('ad'); // 获取基数
上記のコードは、Redis の HLL を使用して広告 ID を保存し、広告 ID を追加して基数を計算することで、広告が表示されたかどうかを判断します。
この場合、まず表示ステータスが「表示中」であるすべての広告をクエリし、次に表示確率要件を満たす広告の数を計算し、最終的には HLL に基づいて、重複したプレゼンテーションを防止します。以下は PHP クエリ コードです:
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); // 查询展示状态为“展示中”的所有广告信息 $sql = "SELECT * FROM ad WHERE status=1"; $result = $mysqli->query($sql); $total = 0; while ($row = $result->fetch_assoc()) { $show_ratio = $row['show_ratio']; // 广告展示概率 $ad_id = $row['ad_id']; // 广告 ID // 判断是否需要展示该广告 $rand_num = mt_rand(1, 10000); if ($rand_num <= $show_ratio * 10000) { $redis->pfadd('ad', $ad_id); // 添加广告 ID $total++; } } $count = $redis->pfcount('ad'); // 获取基数 if ($total != $count) { // 如果总数量不等于 HLL 的基数,则有重复广告 // 再次处理广告展示逻辑 }
上記のコードは while ループを使用して確率を計算し、各広告に追加します。 HLL に基づいて重複表示を削除するコードは while ループの外側にあり、HLL に追加された要素の数が計算された広告の数と等しいかどうかを判断することで重複広告があるかどうかを判断します。
この記事では、Redis を使用して HLL データ構造を実装し、重複しないデータの効率的なクエリを実現する方法を紹介します。実際のプロジェクトでは、特定のニーズに応じて改善および拡張できます。たとえば、有効期限を追加して期限切れの要素を定期的に削除したり、ブルーム フィルターのレイヤーを HLL に追加して重複排除の精度を向上したりできます。これらの方法により、データのクエリ時によく発生する重複排除の問題が解決され、アプリケーションの効率とパフォーマンスが向上すると考えられています。
以上がPHPで重複しないデータ構造をクエリする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。