>백엔드 개발 >PHP 문제 >PHP에서 중복되지 않은 데이터 구조를 쿼리하는 방법

PHP에서 중복되지 않은 데이터 구조를 쿼리하는 방법

PHPz
PHPz원래의
2023-04-04 10:44:39681검색

인터넷이 지속적으로 발전하면서 웹사이트와 애플리케이션에서 데이터베이스를 사용하는 것이 점점 더 보편화되었습니다. 애플리케이션을 개발하고 유지 관리할 때 데이터를 쿼리하는 것은 매우 중요한 작업입니다. 데이터를 효율적으로 쿼리하고 처리하는 방법은 개발자가 직면한 중요한 문제가 되었습니다. 이 기사에서는 이 문제를 해결하기 위해 PHP로 중복되지 않은 데이터 구조를 쿼리하는 방법을 소개합니다.

  1. 사례 소개

광고 시스템이 있다고 가정해 보겠습니다. 각 광고에는 고유한 ID 번호가 있으며 서로 다른 페이지에 표시될 수 있습니다. 특정 페이지에 광고를 표시하려면 MySQL 데이터베이스의 광고 데이터를 쿼리하고 다음 세 가지 조건에 따라 결과를 필터링하면 됩니다.

1) 표시 상태: "표시 중" 상태만 표시합니다(상태= 1) 광고.

2) 노출 확률 : 각 광고에는 노출 확률(show_ratio)이 있으며, 그 확률에 따라 광고 노출 여부가 결정됩니다.

3) 중복 표시: 같은 페이지에 중복된 광고를 표시하지 않습니다.

조건에 맞는 광고 데이터를 효율적으로 조회하려면 어떻게 해야 할까요? 이를 위해서는 효율적이고 중복되지 않는 데이터 구조가 필요합니다.

  1. 비반복 데이터 구조 소개

위 쿼리 조건을 충족하기 위해 이 문서에서는 Redis 기반의 비반복 데이터 구조인 HyperLogLog(간단히 HLL)를 소개합니다. 데이터 세트, 즉 다른 요소 번호입니다. HLL을 사용하면 표시 상태가 "표시 중"인 광고 수와 표시 충족 확률을 빠르게 계산하고 중복 표시를 제거할 수 있습니다.

HLL은 일련의 해시 함수를 사용하여 데이터 세트의 카디널리티를 추정합니다. 구현 원리는 Bloom 필터와 유사하지만 오류율이 더 낮습니다. 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를 추가하고 베이스를 계산하여 광고 표시 여부를 결정합니다.

  1. 사례 구현

이 경우 먼저 표시 상태가 "표시 중"인 모든 광고를 쿼리한 다음 표시 확률 요구 사항을 충족하는 광고 수를 계산하고 최종적으로 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에 추가된 요소 수가 계산된 광고 수와 동일한지 여부를 판단하여 중복 광고가 있는지 확인합니다.

  1. 요약

이 글에서는 중복되지 않은 데이터에 대한 효율적인 쿼리를 달성하기 위해 Redis를 사용하여 HLL 데이터 구조를 구현하는 방법을 소개합니다. 실제 프로젝트에서는 특정 요구에 따라 개선 및 확장될 수 있습니다. 예를 들어 만료 시간을 추가하여 만료된 요소를 정기적으로 삭제하거나 HLL에 블룸 필터 레이어를 추가하여 중복 제거의 정확성 등을 향상시킬 수 있습니다. 이러한 방법은 데이터를 쿼리할 때 자주 발생하는 중복 제거 문제를 해결하고 애플리케이션의 효율성과 성능을 향상시킬 수 있다고 믿어집니다.

위 내용은 PHP에서 중복되지 않은 데이터 구조를 쿼리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.