Heim  >  Artikel  >  Datenbank  >  Redis speichert Protokolle und beliebte Artikel

Redis speichert Protokolle und beliebte Artikel

齐天大圣
齐天大圣Original
2020-05-12 08:32:431892Durchsuche

Mit dem Listendatentyp von Redis, der in PHP als Indexarray betrachtet werden kann, können verschiedene Datenstrukturen implementiert werden. Es kann eine Vielzahl von Datenstrukturen wie Stapel, Warteschlangen und Nachrichtenwarteschlangen implementieren. Heute möchte ich Ihnen vorstellen, wie Sie mit Redis Systemprotokolle und beliebte Artikellisten speichern.

Protokolle speichern

Wie wir alle wissen, werden Nginx-Protokolle standardmäßig nicht automatisch geschnitten. Sie werden immer in einer Datei gespeichert beigefügt. Wir müssen den Holzschnittvorgang selbst durchführen. Neben Nginx werden vielerorts auch Protokolle verwendet. Wenn etwas schief geht, sind Protokolle eine der wichtigsten Methoden, mit denen wir nach Hinweisen suchen.

Wir planen jetzt, die Systemprotokolle in Redis zu schreiben. Tägliche Protokolle werden in einer Liste aufgezeichnet, um zu verhindern, dass eine einzelne Protokolldatei zu groß wird.

Die Grundidee besteht darin, tägliche Protokollinformationen in eine separate Liste zu schreiben und dann eine geplante Aufgabe auszuführen. Die Funktion der geplanten Aufgabe besteht darin, die Protokollliste von vor einem Monat zu entfernen und beizubehalten . in eine Textdatei kopieren und dann die Protokollliste von vor einem Monat in Redis löschen, um zu verhindern, dass Redis zu viel Speicher belegt.

Sie können die Komprimierungsfunktion verwenden, um Protokollinformationen zu komprimieren und so den Speicherverbrauch zu reduzieren. Pflegen Sie außerdem eine Liste zum Speichern der Schlüsselnamen der Protokollliste, um das Abrufen der Schlüsselnamen der Protokollliste zu erleichtern. Der Pseudocode zum Speichern von Protokollen lautet wie folgt:

$log = ... // 日志信息
// 日志列表键名
$key = 'log:'.strtotime(date('Y-m-d'));

// 维护一个键名列表
if (!$redis->exists($key)) {
 $listlogkey = 'log:key';
 $redis->rpush($listlogkey, $key);
}

// 日志信息存放到redis中
$redis->rpush($key, $log);

Der Code für die geplante Aufgabe lautet wie folgt:

$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(&#39;log:key&#39;, $logkey);
        exit;
    }
}

Hier sind einige Punkte zu beachten, wenn das persistente Protokoll fehlschlägt innerhalb des letzten Monats liegt, müssen Sie den Namen des Protokolllistenschlüssels von links erneut eingeben. Darüber hinaus sollten Sie beim Abrufen von Protokollen aus der Protokollliste nicht alle auf einmal abrufen, da dies leicht zu einer Redis-Blockierung führen kann. Nehmen Sie jedes Mal eine bestimmte Zahl (z. B. 50) und führen Sie sie in einer Schleife aus.

Speichern beliebter Nachrichten-IDs

Ich werde hier nicht den Code veröffentlichen, sondern hauptsächlich über die Ideen sprechen. Früher habe ich ein System mit einer Menüfunktion erstellt, einschließlich der heißesten Tage von heute, der heißesten Woche und der heißesten Tage im Januar. Zu diesem Zeitpunkt war unsere Website ziemlich stark frequentiert, aber innerhalb weniger Tage war die Website nicht mehr verfügbar. Der Grund ist das langsame Abfrageproblem von MySQL. Weil dieser Teil von SQL Gruppierung, COUNT(), bedingte Beurteilung usw. umfasst.

Lassen Sie mich Ihnen etwas über unsere Lösung erzählen: Schreiben Sie eine gespeicherte MySQL-Prozedur und rufen Sie die gespeicherte Prozedur regelmäßig auf. Die Funktion dieser gespeicherten Prozedur besteht darin, die beliebtesten Artikel heute, diese Woche und Januar herauszufiltern, jeweils 100 Artikel-IDs zu verwenden und ihre Artikel-IDs in der Redis-Warteschlange zu speichern. Bei den beliebtesten Artikeln zeigen wir nur die Top 100 an. Auf diese Weise hat unser System keine langsamen Abfragen.

Das obige ist der detaillierte Inhalt vonRedis speichert Protokolle und beliebte Artikel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn