Maison >développement back-end >Problème PHP >Comment interroger des structures de données non dupliquées en php
Avec le développement continu d'Internet, l'utilisation de bases de données dans les sites Web et les applications est devenue de plus en plus courante. Lors du développement et de la maintenance d'applications, l'interrogation des données est une tâche très critique. Comment interroger et traiter efficacement les données est devenu un problème important auquel sont confrontés les développeurs. Cet article présentera une méthode d'interrogation de structures de données non dupliquées avec PHP pour résoudre ce problème.
Supposons qu'il existe un système publicitaire. Chaque publicité possède un numéro d'identification unique et peut être affichée sur différentes pages. Si vous souhaitez afficher la publicité sur une certaine page, vous pouvez interroger les données de la publicité dans la base de données MySQL et filtrer les résultats selon les trois conditions suivantes :
1) Statut d'affichage : afficher uniquement le statut « affichage » (statut= 1) Publicité.
2) Probabilité d'affichage : chaque publicité a une probabilité d'affichage (show_ratio), et il est décidé d'afficher ou non la publicité en fonction de la probabilité.
3) Affichage en double : N'affichez pas d'annonces en double sur la même page.
Comment interroger efficacement les données publicitaires qui remplissent les conditions ? Cela nécessite une structure de données efficace et non dupliquée.
Afin de répondre aux conditions de requête ci-dessus, cet article présente une structure de données non répétitive basée sur Redis - HyperLogLog (HLL en abrégé) peut estimer efficacement la cardinalité d'un. ensemble de données, c'est-à-dire un nombre d'éléments différents. Grâce à HLL, vous pouvez rapidement compter le nombre de publicités avec le statut d'affichage « En affichage » et la probabilité d'affichage qui répondent aux exigences, et supprimer les affichages en double.
HLL estime la cardinalité d'un ensemble de données en utilisant un ensemble de fonctions de hachage. Son principe de mise en œuvre est similaire au filtre Bloom, mais son taux d'erreur est inférieur. Dans Redis, le type HLL fournit la commande pfadd pour ajouter des éléments et la commande pfcount pour calculer la cardinalité. Voici un exemple de code 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'); // 获取基数
Le code ci-dessus utilise HLL dans Redis pour stocker l'identifiant publicitaire et détermine si une publicité a été affichée en ajoutant l'identifiant publicitaire et en calculant la base.
Dans ce cas, interrogez d'abord toutes les annonces dont l'état d'affichage est « En cours d'affichage », puis calculez le nombre d'annonces qui répondent aux exigences de probabilité d'affichage, et enfin empêchez l'affichage répété selon HLL. Ce qui suit est un code de requête 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 的基数,则有重复广告 // 再次处理广告展示逻辑 }
Le code ci-dessus utilise une boucle while pour calculer et ajouter une probabilité à chaque publicité. Le code permettant de supprimer les affichages en double en fonction de la HLL est situé en dehors de la boucle while. Il détermine s'il existe des annonces en double en jugeant si le nombre d'éléments ajoutés à la HLL est égal au nombre d'annonces calculées.
Cet article présente une méthode d'utilisation de Redis pour implémenter la structure de données HLL afin d'obtenir une interrogation efficace de données non dupliquées. Dans les projets réels, il peut être amélioré et étendu en fonction des besoins spécifiques. Par exemple, vous pouvez ajouter un délai d'expiration pour effacer régulièrement les éléments expirés, ou ajouter une couche de filtres Bloom au HLL pour améliorer la précision de la déduplication, etc. On pense que ces méthodes peuvent résoudre les problèmes de déduplication souvent rencontrés lors de l'interrogation de données et améliorer l'efficacité et les performances des applications.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!