Heim  >  Artikel  >  Datenbank  >  Entdecken Sie die Redis-Persistenzprinzipien

Entdecken Sie die Redis-Persistenzprinzipien

angryTom
angryTomnach vorne
2020-02-22 16:18:442466Durchsuche

Entdecken Sie die Redis-Persistenzprinzipien

Eingehende Untersuchung des Persistenzprinzips von Redis

Redis ist eine In-Memory-Datenbank Um die Persistenz von Daten sicherzustellen, stellt Redis zwei Persistenzmethoden bereit: RDB und AOF.

Redis ist eine In-Memory-Datenbank bietet zwei Persistenzmethoden, RDB und AOF. Schauen wir uns die Implementierungsprinzipien dieser beiden Persistenzmethoden separat an.

RDB (Standard)

RDB wird durch Snapshots vervollständigt. Wenn bestimmte Bedingungen erfüllt sind, speichert Redis die Daten automatisch im Speicher auf der Festplatte.

Der Zeitpunkt des Auslösens des Snapshots

  • entspricht den benutzerdefinierten konfigurierten Snapshot-Regeln. (Konfiguriert in redis.conf, detailliert unten)
  • Führen Sie den Befehl „save“ oder „bgsave“ aus
  • Führen Sie den Befehl „flushall“ aus
  • Führen Sie den Master-Slave-Replikationsvorgang aus (zuerst Mal)

(Kostenloses Lernvideo-Tutorial empfohlen: MySQL-Video-Tutorial)

Schematisches Diagramm

Entdecken Sie die Redis-Persistenzprinzipien

  • Während des Snapshot-Vorgangs, also des Prozesses der Dateigenerierung, wird die ursprüngliche RDB-Datei erst dann geändert, wenn der Snapshot generiert wird, und die alte wird zur Gewährleistung direkt durch die neue ersetzt dass die RDB-Datei jeden Moment vollständig ist.
  • Wir können Redis-Daten sichern, indem wir regelmäßig RDB-Dateien sichern. RDB ist eine komprimierte Binärdatei, die wenig Platz beansprucht und die Übertragungsregeln begünstigt save {Wie viele Sekunden} {Wie viele Daten sich geändert haben🎜>
  • Zum Beispiel: save 100 1: Machen Sie innerhalb von 100 Sekunden einen Schnappschuss, wenn mindestens ein Schlüssel geändert wird. save 200 4: Innerhalb von 200 Sekunden um mindestens 4 Machen Sie einen Schnappschuss, wenn der Schlüssel geändert wird.

Vor- und Nachteile von RDB

Nachteile: Wenn RDB für die Persistenz verwendet wird, gehen die Daten nach dem letzten Snapshot verloren, wenn Redis plötzlich abnormal beendet wird. Sie können jedoch basierend auf der Kombination automatische Snapshots einrichten, um den Datenverlust zu reduzieren und sicherzustellen, dass er im akzeptablen Bereich liegt. Wenn die Daten wichtiger sind, können Sie die AOF-Methode verwenden.

Vorteile: Die Verwendung der RDB-Methode kann die Redis-Leistung maximieren. Während des Snapshot-Prozesses können wir sehen, dass der Hauptprozess nur einen untergeordneten Prozess ausspalten muss , und der Rest Die gesamte Arbeit wird vom untergeordneten Prozess erledigt, und der übergeordnete Prozess muss keine Festplatten-E/A-Vorgänge ausführen. Wenn der Datensatz jedoch groß ist, ist das Forken des untergeordneten Prozesses zeitaufwändig, was dazu führt, dass Redis die Verarbeitung von Anforderungen für einen bestimmten Zeitraum einstellt.
  • AOF-Methode
  • Standardmäßig aktiviert Redis AOF (nur Datei anhängen) nicht. Nach dem Start von AOF schreibt Redis jedes Mal, wenn es einen Befehl zum Ändern der Redis-Daten empfängt, den Befehl in die AOF-Datei auf der Festplatte. Natürlich verringert dieser Prozess die Leistung von Redis, ist aber in den meisten Fällen akzeptabel. Gleichzeitig kann die Verwendung einer leistungsstärkeren Festplatte die AOF-Leistung verbessern

AOF-Konfigurationsmethode

# 开启appendonly参数appendonly true# 设置AOF文件位置dir ./# 设置AOF文件名称,默认是appendonly.aofappendfilename appendonly.aof<br/>

Prinzipbild

RESP-Protokoll

Entdecken Sie die Redis-PersistenzprinzipienDer Redis-Client verwendet das RESP-Protokoll für die Kommunikation mit dem Redis-Server. Dieses Protokoll wurde speziell für Redis entwickelt, kann aber auch verwendet werden Wird in anderen C-S-Projekten verwendet.

Leerzeichen: rn unter Linux, n unter Windows

Einfache Zeichenfolge beginnt mit „+“
  • Fehler, beginnt mit „-“. Beginnend mit
  • Integer-Typ Integer, beginnend mit ':'
  • Große Zeichenfolge, beginnend mit '$'
  • Array-Typ Arrays, beginnend mit '*'
  • AOF Prinzipbeschreibung
  • Redis speichert Daten, indem es alle Schreibbefehle in AOF-Dateien aufzeichnet. Der Prozess der Aufzeichnung von Befehlen in AOF-Dateien kann in drei Phasen unterteilt werden:

Befehlsweitergabe

Cache-Anhängen
  • Dateischreiben und -speichern
  • Befehlsweitergabe
  • redis sendet den ausgeführten Befehl, die Befehlsparameter, die Befehlsparameter-Rasternummer und andere Inhalte an das AOF-Programm. Wenn der Redis-Client einen Befehl ausführt, sendet er den Protokolltext über die Verbindung an Redis. Nachdem Redis den Protokolltext empfangen hat, wählt er die entsprechende Befehlsfunktion basierend auf dem Inhalt aus und konvertiert den Protokolltext nach dem Befehl in ein Redis-String-Objekt Die Funktion wird ausgeführt. Anschließend werden die Befehlsparameter an das AOF-Programm gesendet.

缓存追加

AOF程序接收到命令参数之后,会将其从字符串对象转换成协议内容,再将协议内容追加到AOF缓存中。AOF缓存是在redisServer结构的aof_buf中,新的内容会被追加到aof_buf末尾。aof_buf保持着所有未被写入到AOF文件的协议文本。

文件写入和保存

将AOF缓存内容写入到AOF文件,并保持到磁盘。 当服务器的常规函数被执行,或者事件处理器被执行的时候,flushAppendOnlyFile函数将会被执行。会有以下两个过程。

  • WRITE:将AOF缓存中的内容写入到AOF文件
  • SAVE:调用fsync或者fdatasync函数,将AOF文件保存到磁盘中

AOF一共有三种保存模式

  • AOF_FSYNC_NO:不保存。在这种模式下,每次调用flushAppendOnlyFile函数,write会被执行,而save会被忽略。而save只有在以下三种条件下会触发,redis关闭,aof功能关闭,系统的写缓存被刷新(可能是缓存满了,或者定期执行保持操作)。这三种情况下执行save操作会引起redis主线程的阻塞。
  • AOF_FSYNC_EVERYSEC(默认):每秒保存一次。save每秒被执行一次,但是save由后台子线程完成,不会导致redis主线程阻塞。
  • AOF_FSYNC_ALWAYS:每执行一个命令保存一次。这种情况下,每执行一个命令write和save都会被执行,而且save操作由主线程完成,会导致redis的阻塞。安全性较高,性能较差,因此不推荐使用。

AOF的文件优化

Redis可以在AOF文件过大的时候,在后台(子进程)对AOF文件进行重写。重写之后的新文件,包含恢复当前数据集所需的最小命令集合。重写,并不会对AOF文件进行读取和写入,针对的是数据库中的当前键。

优化前set s1 1set s1 2set s1 3优化后set s1 3<br/>

AOF文件优化原理

AOF的重写是通过子进程实现的,因此,主线程是继续工作的,有可能对新的数据进行修改,有可能会导致数据库的数据和重写之后的数据不一致。redis通过增加一个AOF重写缓存来解决这个问题,当fork出子进程之后,新的命令不仅会追加到现有的AOF文件中,还会添加一份数据到这个缓存当中。

Entdecken Sie die Redis-Persistenzprinzipien

重写过程分析(需要保证从写的操作是绝对安全的)

Redis创建新的AOF文件之后,会继续将命令添加到原有的AOF文件中,即使数据库突然宕机了,原有的AOF文件和文件内容也不会有损失。而当新的AOF文件创建完毕之后,会直接把旧的替换掉,往新的AOF文件中添加命令。

当子进程在进行重写时,主进程会完成下列工作

  • 处理请求,将新的命令继续添加到AOF文件中,同时将命令添加到AOF重写缓存中。保证数据的一致行,避免出现数据丢失。
  • 当子进程重写完毕之后会向主进程发送一个完成信号,这时主进程会把重写缓存中的内容添加到新的AOF文件中,这样新的AOF文件,数据库,旧的AOF文件的内容就完全一致了。然后对新的AOF文件改名,覆盖原有的AOF文件。

这样程序就完成了新旧AOF文件的替换工作。而当处理完成之后,主进程就会继续接受请求。整个重写过程中只有最后的缓存写入和改名替换的操作会导致主进程阻塞,其他时候不会影响redis的正常工作,把AOF重写对redis的性能影响降到最低。

优化触发条件

#当前的AOF文件超过上次重写时AOF文件大小百分几的时候进行重写,如果没有重写过,则以启动时AOF文件的大小为准auto-aof-rewrite-percentage 100#限制允许重写的最小的AOF文件,也就是文件小于这个值的时候不需要进行重写优化auto-aof-rewrite-min-size 64mb<br/>

本文转载自:https://database.51cto.com/art/202002/610825.htm

更多redis知识请关注redis数据库教程栏目。 

Das obige ist der detaillierte Inhalt vonEntdecken Sie die Redis-Persistenzprinzipien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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