Heim  >  Artikel  >  Datenbank  >  Wie realisiert Redis Seitenaktualisierungen in Echtzeit und automatische Online-Updates?

Wie realisiert Redis Seitenaktualisierungen in Echtzeit und automatische Online-Updates?

WBOY
WBOYnach vorne
2023-06-03 20:56:171329Durchsuche

Beschreibung der Anforderungen

Einige Seiten müssen mit Anzeigen oder Bildern zur Veranstaltungswerbung konfiguriert werden. Anzeigen oder Aktivitäten müssen jederzeit online und offline geschaltet werden können, nach Ablauf automatisch offline geschaltet werden und zu gegebener Zeit automatisch online geschaltet werden.

Zum Beispiel: Die aktuelle Uhrzeit ist der 22.02.2019, 16:16:13 Uhr. Um die Preisabholungsaktivität auf der Zahlungsabschlussseite zu konfigurieren, muss die Aktivität pünktlich zum 10.03.2019 um 00:00:00 Uhr online sein und am 30.03.2019 23:59:59 Ende der Aktivität.

Daher besteht der gewünschte Effekt darin, dass nach der Konfiguration der Aktivität zu einem beliebigen Zeitpunkt, bevor die Aktivität online geht, die Seite automatisch zum angegebenen Zeitpunkt online geht. Es kann auch mehrere andere Aktivitäten oder Anzeigen auf jeder Seite geben, und die Online- und Offline-Zeiten können für verschiedene Seiten unterschiedlich sein. Auch andere Seiten müssen solche Funktionen implementieren, und die Aktivitäten zwischen den Seiten sind nicht unbedingt erforderlich das gleiche.

Anforderungsanalyse

Die Anforderungen sind nur ein paar Worte, also analysieren wir sie im Detail.

Schlüsselwörter extrahieren

  • Werbe- oder Event-Promotion-Bilder

  • Jederzeit online und offline, automatisch offline, wenn abgelaufen, und automatisch online, wenn es soweit ist

  • Die Anzahl der Anzeigen auf jeder Seite ist variabel

  • Unterschiedliche Anzeigen. Die Online- und Offline-Zeiten können unterschiedlich sein. Die Aktivitäten zwischen den Seiten sind nicht unbedingt gleich. Datenbankanalyse Seiten, einige Seiten Die Werbung kann gleich sein, das heißt, die Werbung wird wiederverwendet, daher muss eine Werbetabelle vorhanden sein.

  • 2. [Die Anzahl der Anzeigen auf jeder Seite ist variabel] [Die Online- und Offline-Zeiten verschiedener Anzeigen können unterschiedlich sein] [Aktivitäten zwischen Seiten sind nicht unbedingt gleich]
  • Eine Seite kann mit mehreren Anzeigen konfiguriert werden Davon sind eine Seitenkonfigurationstabelle und die Beziehungstabelle zwischen Anzeigen und Seiten, also die Seitenanzeigentabelle, erforderlich.

  • Die Seitenkonfigurationstabelle konfiguriert hauptsächlich die Anzahl der zu realisierenden Werbungen auf der Seite [die Anzahl der Werbungen auf jeder Seite ist variabel]. Die Seitenwerbungstabelle konfiguriert hauptsächlich die Online- und Offline-Zeit jeder Werbung auf der Seite, um [die Online- und Offline-Zeit verschiedener Anzeigen können unterschiedlich sein]

Basierend auf einer einfachen Analyse habe ich die folgende Tabellenstruktur gefunden: Werbetabelle (adv), Seitenkonfigurationstabelle (page_config) und Seitenwerbetabelle (page_adv)

Denken

Die auf diesen Seiten konfigurierten Anzeigen ändern sich für einen bestimmten Zeitraum nicht. Wenn die Anzahl der Seitenanfragen hoch ist, wird die Anzahl der Anzeigenabfragen sehr häufig sein, was zu einer unnötigen Belastung der Datenbank führt. Daher kann Caching eingeführt werden, um die Anzahl der Datenbankanforderungen zu reduzieren und den Datenbankdruck zu verringern. Hier wird Redis verwendet.

Wann wird es zwischengespeichert?

Sie können die Anzeigen, die sich in den Online- und Offline-Zeitintervallen befanden, asynchron in den Cache laden, wenn der Dienst gestartet wird, oder den Cache abrufen, wenn die Anfrage gestellt wird. Wenn der Cache nicht vorhanden ist, überprüfen Sie dies Bibliothek und legen Sie sie in den Cache. Die Caching-Zeit hängt von der Situation ab.

Hier besteht die Möglichkeit, die Werbekonfigurationsinformationen berechtigter Seiten beim Start des Projekts asynchron in Redis zu speichern. Diejenigen, die den angegebenen Zeitpunkt noch nicht erreicht haben, werden nicht zuerst in Redis abgelegt, wenn auf die Seite zugegriffen wird, um die Werbung zu laden. Redis wird zuerst überprüft. Wenn keine vorhanden ist, drücken Sie Bedingung (>=nowtime), um die Datenbank zu überprüfen und sie nach der Überprüfung in Redis zu speichern.
Wie realisiert Redis Seitenaktualisierungen in Echtzeit und automatische Online-Updates?Bestimmen Sie nach dem Abrufen der Ankündigungskonfigurationsinformationen von der Schnittstelle, ob die aktuelle Zeit innerhalb des konfigurierten Zeitintervalls liegt. Da mehrere Ankündigungen auf einer Seite konfiguriert sind, sind unterschiedliche Ankündigungszeiten unterschiedlich, daher ist es notwendig, die Zeiten zu iterieren und zurückzugeben Markieren Sie es und löschen Sie die Konfigurationsinformationen der gesamten Seite in Redis. (Oder wählen Sie nicht das Laden beim Start, sondern fügen Sie den Cache einfach hinzu, wenn der Benutzer dies anfordert. Die Methode in Schritt 1 unten wird jedoch beim Aktualisieren des Ladevorgangs verwendet, sodass er nicht gelöscht werden kann.)

Spezifische Implementierung

Schritt 1, Wenn das Projekt startet, speichern Sie zunächst die Konfigurationsinformationen für die Seitenanzeige in Redis

a, fragen Sie alle Seiten-IDs ab

SELECT pageId FROM page_config page_adv WHERE nowtime<p> und verknüpfen Sie die beiden Tabellen, um List<pageid> zu erhalten. Sie erhalten alle mit Anzeigen konfigurierten Seiten-IDs und die Anzeigen nicht Abgelaufen. </pageid></p><p>b. Fragen Sie das Werbebild und den Sprunglink ab, der der PegeId entspricht. </p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_adv adv WHERE begintime <p></p>Schritt 2: Schreiben Sie eine Schnittstelle für das Front-End zum Abfragen von Seitenanzeigen. <h3></h3>Geschrieben gemäß der Standardkontrollschicht, der Geschäftsschicht und der Datenzugriffsschicht. Die Logik im ersten Schritt wird in der Geschäftsschicht vervollständigt. <h4></h4>Kontrollschicht: <p></p>Die Kontrollschicht empfängt den Parameter pageId, ruft die Geschäftsschicht auf, um die auf der entsprechenden Seite konfigurierten Werbeinformationen abzufragen, stellt fest, dass diese leer sind, und gibt direkt den Statuscode 0 zurück, dh es gibt keine Werbung und Das Frontend zeigt es nicht an. <p></p>Wenn es nicht leer ist, werden die Daten gemäß der Geschäftslogik verarbeitet (z. B. die URL von img plus Domänenname), und dann wird Statuscode 1 zurückgegeben und das Front-End zeigt die Werbung an. Die Steuerungsschicht kann hier auch eine Logik hinzufügen, um die Anzeigenliste zu iterieren, die aktuelle Zeit innerhalb der Anzeigenstartzeit zurückzugeben und diejenigen nicht zurückzugeben, die nicht vorhanden sind. Und solange eine Anzeige abläuft, wird dies der Anzeigenlisten-Cache dieser Seite tun gelöscht werden. Die Logik besteht darin, die abgelaufenen zu löschen. <p></p>Geschäftsschicht: <p></p>Rufen Sie zuerst den Cache ab und überprüfen Sie dann die Datenbank, um festzustellen, ob sie nicht leer ist (diese Seite ist mit Werbung konfiguriert), legen Sie sie in den Cache (pageId ist SCHLÜSSEL) und kehren Sie dann zurück. <h4></h4>Datenzugriffsschicht: <p></p>SQL:<p></p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_config adv page_adv WHERE begintimeDrei-Tabellen-Gemeinschaftsabfrage, Abfrage der auf der aktuellen Seite konfigurierten Werbekampagneninformationen basierend auf der Seiten-ID (bereits innerhalb der Werbekampagnenzeit)<p></p>Schritt 3, Laden aktualisieren<p></p>Warum verwenden? Aktualisieren wird geladen? <p></p><p>因为有这样的场景:给页面A配置了一个广告(当前时间在广告的起始时间内),那么这个页面的广告已经在缓存里了,假如此时A页面要新加一个广告,在后台配置后如果不做其他操作,这个广告不会显示(假设缓存时间较长,为一天),因为库更新了,缓存没有同步更新。</p><p>解决方案</p><p>使用Redis的发布订阅机制实现缓存的刷新加载,使新配置的广告及时能够显示。刷新加载的回调方法即第1步中的方法。</p><h3>进一步优化</h3><p>想一想,目前的实现存在什么问题?</p><p>存在的问题</p><p>假如有页面需要配置广告,但是还没有配(前端已经开发完上线,每次都会调接口查广告信息),那么数据库肯定查不到,缓存也没有。如果这个页面访问量很大,那么缓存没命中就查库,这样对库的压力就会很大,这就是缓存穿透,请求上来了很容易击垮数据库。那怎么办呢?</p><p>解决方案</p><p>当页面没有配置广告时,在缓存存标志,查询时先看标志,在决定是否往下走。</p><p>具体方案</p><p>这时,上面的第1步就要改了。</p><p>1、首先改第1步的步骤a的SQL,把所有的pageId都查询出来。</p><p>使用左连接</p><pre class="brush:php;toolbar:false">SELECT pageId FROM page_config LEFT JOIN page_adv ON ...  GROUP BY pageId

或者干脆查page_config

SELECT pageId FROM page_config

目的是把已在page_config表中配置,但关系表中page_adv未配置广告的pageId也查出来,这样才能给未配置广告的pageId在缓存里放标志

2、第1步的步骤b的SQL改为

SELECT 字段名 FROM page_adv adv WHERE nowtime<p>然后把查到的配置信息放入缓存之前判断【为空时的不做操作】改为【为空时存入一个标志】假如这个标志KEY为pageId+"_EMPTY_FLAG",value为"DB_IS_NULL"</p><p>为什么只判断小于结束时间</p><p>因为如果该页面配置的广告开始时间大于当前时间,那么这个是查不到的,会被处理为DATABASE_IS_NULL,如果在这个标志还没失效之前就到了配置的开始时间了,那么这个广告不会被展示。所有要让未到开始时间的也放入缓存,然后让控制层去判断在不在时间区间。</p><p>3、所以要在第2步也修改一下</p><p>在业务层里取缓存中的广告列表之前,先从缓存取pageId+"EMPTY_FLAG"的value判断为"DB_IS_NULL"直接返回空,这样就能避免缓存穿透的问题了。</p><p>继续修改第2步的业务层,查库的SQL同样要改:</p><pre class="brush:php;toolbar:false">SELECT 字段名 FROM page_config adv page_adv WHERE nowtime<p>然后判断为空的话,同上面的黄字那样处理。</p><p>4、最后,第3步的刷新加载调的是第1步的方法,不用改。<br><br>当然这个缓存穿透的优化方案只是其中一种。还可以这样:</p><p>1、控制层拦截:根据pageId查询page_adv表,查不到说明没配置,直接返回。</p><p>2、page_config 表增加字段,表示当前页面已经配置的广告个数,默认0,每配置一个该字段加1,把大于0的pageId缓存起来,调接口时前判断在不在缓存里。</p>

Das obige ist der detaillierte Inhalt vonWie realisiert Redis Seitenaktualisierungen in Echtzeit und automatische Online-Updates?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen