1. Vorwort
Bevor der Artikel beginnt, möchte ich Ihnen eine Frage stellen: Wenn wir den Befehl verwenden: expire key second
给一个key设置过期时间,过期时间一到,这个key对应的过期数据
Wird er wirklich sofort vom Server gelöscht? Die Antwort ist, dass es nicht sofort gelöscht wird. Nachdem wir diese Antwort kennen, werfen wir einen Blick darauf, wie abgelaufene Daten in Redis verarbeitet werden.
2. Dateneigenschaften in Redis
Redis ist eine Datenbank auf Speicherebene. Die Daten im Speicher können ihren Status durch TTL-Anweisungen erhalten Befehlsergebnis
Status
XX |
Zeitkritische Daten |
-1 |
Dauerhaft gültige Daten |
-2 |
Abgelaufene Daten oder gelöschte Daten oder undefiniert |
3. Zeitkritische Datenspeicherstruktur
Wenn wir Anweisungen zum Festlegen abgelaufener Daten verwenden, wird die den Daten entsprechende Adresse im Ablaufzeitraum abgelegt. Die Speichermethode ist Hash und der gespeicherte Wert ist der Ablauf Zeit. 4. Strategie zum Löschen von Daten Serverausfall oder Speicherfehler.
1. Geplantes Löschen
Erstellen Sie einen Timer, wenn der Schlüssel eine Ablaufzeit hat Wenn die Zeit erreicht ist, führt die Timer-Aufgabe sofort Schlüssellöschvorgänge durch. CPU-Druck Es ist sehr groß, egal wie hoch die CPU-Last zu diesem Zeitpunkt ist, sie wird die CPU belasten, was sich auf die Antwortzeit des Redis-Servers und den Befehlsdurchsatz auswirkt数据删除策略目标:
在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露
1、定时删除
创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作
优点:节约内存,到时就删除,快速释放掉不必要的内存占用
缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
2、惰性删除
3、定期删除
流程分析:
Redis服务器启动初始化时,读取配置server.hz的值,默认为10
然后每秒钟执行10次serverCron()
方法,该方法用来检测服务器
serverCron()
方法又会调用databasesCron()
方法,该方法是用来遍历数据库的,redis默认有16个数据库,从第一个数据库开始
databasesCron()
方法又会调用activeExpireCycle()
方法,该方法会对每一个expires[*]
逐一进行检测,每次执行250ms/server.hz;对某个expires[*]
检测时,随机挑选W个key检测
如果检测到key超时,则删除key;如果一轮中删除的key的数量>W25%,循环该过程;如果一轮中删除的key的数量≤W25%,检查下一个expires[*]
,0-15循环。其中W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行
参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行
总结:
2. Lazy Deletion
Die Daten erreichen die Ablaufzeit und werden nicht verarbeitet. Beim nächsten Zugriff auf die Daten wird die Funktion expireIfNeeded()
aufgerufen, um festzustellen, ob die Daten abgelaufen sind: Wenn sie nicht abgelaufen sind, geben Sie die Daten zurück, stellen Sie fest, dass sie abgelaufen sind, löschen Sie sie und zurückgeben, es existiert nicht
Vorteile:Sparen Sie CPU-Leistung, löschen Sie nur, wenn Sie feststellen, dass es notwendig ist zu löschen
Nachteile:Hoher Speicherdruck, Daten das lange Zeit Speicher beansprucht, erscheint |
|
|
3. Regelmäßige Löschung
|
Prozessanalyse:
| Wenn der Redis-Server startet und initialisiert, liest den Wert der Konfiguration server.hz, der Standardwert ist 10 |
| Dann wird die Methode serverCron()
10 Mal pro Sekunde ausgeführt, um den Server zu erkennen |
Die Methode serverCron()
ruft wiederum die Methode databasesCron()
auf. Diese Methode wird standardmäßig zum Durchlaufen der Datenbank verwendet, beginnend mit der Die erste Datenbank |
|
databasesCron()
-Methode ruft die activeExpireCycle()-Methode auf. Diese Methode erkennt jeden expires[*]
einzeln , jedes Mal 250 ms/server.hz ausführen; für einen bestimmten expires[* ]
Während der Erkennung zufällig W-Schlüssel zur Erkennung auswählen |
| Wenn das Schlüssel-Timeout erkannt wird, löschen Sie den Schlüssel; Wenn die Anzahl der in einer Runde gelöschten Schlüssel > W25 % ist, wird der Prozess wiederholt. Wenn in einer Runde die Anzahl der gelöschten Schlüssel expires[*], 0-15-Zyklus . Darunter ist der Wert von W = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP-Attributwert
🎜Wenn die Ausführungszeit von activeExpireCycle() abläuft, wird die Ausführung beim nächsten Mal von current_db aus fortgesetzt🎜🎜🎜🎜Der Parameter current_db wird verwendet, um aufzuzeichnen, welcher ActiveExpireCycle abläuft () tritt zur Ausführung ein🎜🎜 🎜🎜 🎜🎜🎜Zusammenfassung:
Fragen Sie regelmäßig die aktuellen Daten in der Redis-Bibliothek ab, übernehmen Sie eine zufällige Extraktionsstrategie und steuern Sie den Anteil der abgelaufenen Daten Löschhäufigkeit 🎜🎜🎜🎜Der Speicherdruck ist nicht sehr hoch, kalte Daten, die lange Zeit den Speicher belegt haben, werden kontinuierlich bereinigt 🎜🎜🎜🎜 5. Vergleich der Löschstrategien 🎜🎜🎜🎜🎜Regelmäßiges Löschen 🎜🎜 Spart Speicher, keine Belegung 🎜🎜 Unabhängig davon belegen Zeiträume CPU-Ressourcen, hohe Frequenz🎜🎜Zeit gegen Speicherplatz tauschen🎜🎜🎜🎜Verzögertes Löschen🎜🎜Starke Speichernutzung🎜🎜Verzögerte Ausführung, hohe CPU-Auslastung🎜🎜Speicherplatz gegen Zeit tauschen🎜🎜🎜🎜 Regelmäßiges Löschen🎜🎜Speicher Regelmäßige zufällige Reinigung🎜🎜verbraucht feste CPU-Ressourcen pro Sekunde, um den Speicher zu erhalten🎜🎜zufällige und gezielte Stichprobenkontrollen🎜🎜🎜🎜6. Räumungsalgorithmus
1. Konzepteinführung
Was soll ich tun, wenn neue Daten in Redis eingegeben werden? Redis verwendet Speicher zum Speichern von Daten. Vor der Ausführung jedes Befehls wird freeMemoryIfNeeded()
aufgerufen, um zu prüfen, ob der Speicher ausreicht. Wenn der Speicher die Mindestspeicheranforderungen für neu hinzugefügte Daten nicht erfüllt, löscht Redis vorübergehend einige Daten, um Speicherplatz für die aktuelle Anweisung freizugeben. Die Strategie zum Bereinigen von Daten wird als Eviction-Algorithmus bezeichnet. freeMemoryIfNeeded()
检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。
注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
2、八种配置
检测易失数据(可能会过期的数据集server.db[i].expires
)
volatile-lru |
挑选最近最少使用的数据淘汰 |
volatile-lfu |
挑选最近使用次数最少的数据淘汰 |
volatile-ttl |
挑选将要过期的数据淘汰 |
volatile-random |
任意选择数据淘汰 |
检测全库数据(所有数据集server.db[i].dict
Hinweis: Der Prozess zum Entfernen von Daten ist nicht zu 100 % in der Lage, genügend nutzbaren Speicherplatz freizugeben. Wenn er nicht erfolgreich ist, wird er wiederholt ausgeführt. Wenn nach dem Ausprobieren aller Daten die Speicherbereinigungsanforderungen nicht erfüllt werden können, wird eine Fehlermeldung angezeigt.
| 2. Acht Konfigurationen |
Erkennen Sie flüchtige Daten (Data set server.db[i].expires
, die möglicherweise ablaufen)
|
| volatile-lru
Wählen Sie die zuletzt verwendete Dateneliminierung aus |
| volatile-lfu
Wählen Sie die zuletzt verwendeten Daten aus, die gelöscht werden sollen.
volatile-ttl
Erkennen Sie die gesamten Datenbankdaten (alle Datensätze server.db[i].dict
)
|
| allkeys-lru
Wählen Sie die zuletzt verwendeten Daten aus, die entfernt werden sollen
🎜🎜🎜allkeys-lfu 🎜🎜Wählen Sie die am längsten verwendeten Daten für die Räumung aus. 🎜🎜🎜🎜Alle Schlüssel sind zufällig 🎜🎜 die Löschung von Daten verbieten ( redis4 .0 Standardstrategie)🎜🎜🎜🎜
Das obige ist der detaillierte Inhalt vonDrei Methoden der Redis-Löschstrategie und Analyse von Beispielen für Räumungsalgorithmen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!