Heim  >  Artikel  >  System-Tutorial  >  Detaillierte Erläuterung des internen Arbeitsmechanismus von Redis

Detaillierte Erläuterung des internen Arbeitsmechanismus von Redis

WBOY
WBOYnach vorne
2024-03-10 09:13:09449Durchsuche

Detaillierte Erläuterung des internen Arbeitsmechanismus von Redis

Redis-Datenbank (Wie Redis eine Datenbank darstellt und wie Datenbankoperationen implementiert werden)

Wenn der Redis-Server initialisiert wird, werden die Datenbanken redis.h/REDIS_DEFAULT_DBNUM (im Folgenden als N abgekürzt) erstellt und die Datenbank-IDs reichen von 0 bis N-1. Alle Datenbanken werden im Array redis.h/redisServer.db gespeichert .

Auf der Clientseite können Sie über den Befehl „SELECT“ wechseln. Das Programm verwendet redis.h/redisServer.db[Nummer], um direkt zu wechseln. Einige interne Programme wie AOF-Programme, Replikationsprogramme und RDB-Programme müssen jedoch die Nummer der aktuellen Datenbank kennen. Wenn kein ID-Feld vorhanden ist, kann das Programm nur auf die aktuell verwendete Datenbank und alle Datenbanken im redisServer verweisen .db-Array. Vergleichen Sie die Zeiger, um herauszufinden, welche Datenbank Sie verwenden.

Redis-Datenbankstruktur:
typeof  struct   redisDb{
int id ;   // 数据库的id

dict *dict ; // 保存着该数据库的所有键值对 也被称为键空间

dict *expires ; // 保存着键的过期时间

…..

} redisDb ;
 Redis 是一个键值对 字典表,同样Redis数据库存储形式也是键值对 字典表
 键是字符串
 值可以是字符型、list 列表、 hash、集合以及 有序集合其中之一
Redis-Schlüsselraumoperationen zum Hinzufügen, Löschen, Ändern, Abfragen und anderen Operationen der Datenbank:

Neu:
Redis fügt dem Schlüsselraumwörterbuch ein Schlüssel-Wert-Paar hinzu, wobei der Schlüssel eine Zeichenfolge und der Wert ein beliebiger Werttyp ist.
Löschen:
Redis löscht das Schlüssel-Wert-Paar des entsprechenden Schlüssels im Schlüsselraumwörterbuch
Update:
Redis gibt das Wertobjekt frei, das dem vorherigen Schlüssel im Schlüsselraumwörterbuch entspricht, und lässt den Schlüssel auf das neue Wertobjekt verweisen
Anfrage:
Redis fragt das Wertobjekt des entsprechenden Schlüssels im Schlüsselraumwörterbuch ab:
Der Schlüssel existiert nicht, geben Sie NULL
zurück Der Schlüssel existiert, hat den richtigen Typ und gibt den richtigen Wert zurück
Der Schlüssel existiert, ist aber vom falschen Typ und der Rückgabetyp ist falsch
Andere Operationen:
Zusätzlich zu den oben gezeigten Schlüsselwertoperationen gibt es viele Befehle für die Datenbank selbst, die auch durch die Verarbeitung des Schlüsselraums abgeschlossen werden:
FLUSHDB Alle Schlüssel-Wert-Paare im Schlüsselraum löschen
RANDOMKEY Gibt einen zufälligen Schlüssel aus dem Schlüsselraum zurück
DBSIZE Gibt die Anzahl der Schlüssel-Wert-Paare im Schlüsselraum zurück
EXISTIERT                                                                                                                        Überprüfen Sie, ob der angegebene Schlüssel im Schlüsselraum vorhanden ist
UMBENENNEN Benennen Sie im Schlüsselbereich den angegebenen Schlüssel um

Ablaufzeit des Schlüssels

In der Redis-Datenbank wird die Ablaufzeit aller Schlüssel im Expires-Wörterbuch der RedisDb-Struktur gespeichert, wobei der Schlüssel ein Zeiger auf einen Schlüssel im Dict-Wörterbuch (Schlüsselraum) ist und der Wert die geänderte Ablaufzeit ist. Verwendung der Darstellung vom Typ „Long Long“.

Redis verfügt über vier Befehle zum Festlegen der Überlebenszeit des Schlüssels (wie lange er überleben kann) und der Ablaufzeit (wann er abläuft):
EXPIRE legt die Lebensdauer des Schlüssels in Sekunden fest;
PEXPIRE legt die Lebensdauer des Schlüssels in Millisekunden fest;
EXPIREAT legt den Ablauf-UNIX-Zeitstempel des Schlüssels in Sekunden fest
PEXPIREAT Legt den UNIX-Zeitstempel für den Ablauf des Schlüssels in Millisekunden fest.

Obwohl es so viele verschiedene Einheiten und unterschiedliche Formen der Einstellungsmethoden gibt, speichert der Wert des Expires-Wörterbuchs nur den „abgelaufenen UNIX-Zeitstempel in Millisekunden“, was bedeutet, dass durch die Konvertierung die Wirkung aller Befehle dieselbe ist wie bei PEXPIREAT Die Wirkung des Befehls ist dieselbe.

Entfernung abgelaufener Schlüssel

定时清除:
在创建KEY的时候创建一个定时任务,在KEY到期时定时任务会被触发,第一时间清除过期KEY。
此种操作对内存最友好,不会有垃圾数据占用内存情况存在
缺点是会造成很大的服务器负载,特别是CPU负载高的时候,CPU很大一部分负载用在了删除不必要的KEY上了

惰性清除:
放任键空间的键不管,每次查询KEY的时候先去校验KEY是否过期,过期则删除,不过期则正常返回相应的VALUE。
此种操作对CPU最友好,这种策略仅限于当前KEY,相关不必要的KEY不会造成CPU负载
缺点是:容易造成内存空间浪费,特别是当系统中存在大量过期KEY且很少被用到,这十分影响非常依赖于内存大小Redis的性能

定期删除:
由定时脚本cron定时对expires的键扫描判断是否有过期的KEY存在,如存在,将其删除掉。
这是一种折中方案,既不会过多消耗CPU,又可以定时清楚惰性删除忽略到的不必要的内存消耗

Redis采用的“惰性清除”和“定期清楚”相结合的方式,其中定期删除模式是在规定的时间限制内,尽 可能地遍历各个数据库的 expires 字典,随机地检查一部分键的过期时间,并删除其中的过期键。

伪代码如下:

def activeExpireCycle():
# 遍历数据库(不一定能全部都遍历完,看时间是否足够)
for db in server.db:
# MAX_KEY_PER_DB 是一个 DB 最大能处理的 key 个数 # 它保证时间不会全部用在个别的 DB 上(避免饥饿) i=0                                    while (i 
<p>Redis 过期键删除的主从同步问题(Redis的机制是由主节点统一控制)</p>
<p>如果服务器是主节点,当它删除一个过期键之后,会显式的向所有附属节点发送一条DEL命令<br>
如果服务器是附属节点,当它判断到当前KEY已经过期,会将该键过期的消息发送给主服务器,主服务器删除后向所有的从服务器节点发送DEL命令。</p>
<p>从服务器节点不自主的对键进行删除是为了保持和主服务器数据的绝对一致性,即当一个过期键还存在主服务器上,这个键在所有的从服务器上也不会被删除。</p>

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des internen Arbeitsmechanismus von Redis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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