1. Übersicht:
In Redis ist der Listentyp eine verknüpfte Liste von Zeichenfolgen, die in der Einfügereihenfolge sortiert sind. Wie bei einer gewöhnlichen verknüpften Liste in einer Datenstruktur können wir dem Kopf (links) und dem Ende (rechts) neue Elemente hinzufügen. Wenn der Schlüssel beim Einfügen nicht vorhanden ist, erstellt Redis eine neue verknüpfte Liste für den Schlüssel. Werden hingegen alle Elemente in der verknüpften Liste entfernt, wird auch der Schlüssel aus der Datenbank gelöscht. Die maximale Anzahl von Elementen, die in einer Liste enthalten sein können, beträgt 4294967295.
Aus der Effizienzperspektive des Einfügens und Löschens von Elementen ist das Einfügen oder Löschen von Elementen an beiden Enden der verknüpften Liste ein sehr effizienter Vorgang. Auch wenn Millionen von Datensätzen in der verknüpften Liste gespeichert wurden, ist dieser Vorgang kann in konstanter Zeit abgeschlossen werden. Es ist jedoch zu beachten, dass das Einfügen oder Löschen von Elementen in der Mitte der verknüpften Liste sehr ineffizient ist. Ich glaube, dass dies für Entwickler mit einer guten Datenstrukturbasis nicht schwer zu verstehen ist.
2. Liste verwandter Befehle:
Befehlsprototyp | Zeitkomplexität | Befehlsbeschreibung | Rückgabewert |
LPUSHkey-Wert [Wert ...] | O(1) | Fügen Sie alle in den Parametern angegebenen Werte in den Kopf des Listenwerts ein, der dem angegebenen Schlüssel zugeordnet ist. Wenn der Schlüssel nicht vorhanden ist, erstellt dieser Befehl vor dem Einfügen eine leere verknüpfte Liste, die dem Schlüssel zugeordnet ist, und fügt dann die Daten aus dem Kopf der verknüpften Liste ein. Wenn der Wert des Schlüssels nicht vom Typ einer verknüpften Liste ist, gibt dieser Befehl relevante Fehlerinformationen zurück. | Die Anzahl der Elemente in der verknüpften Liste nach dem Einfügen. |
LPUSHX-Schlüsselwert | O(1) | Nur wenn der im Parameter angegebene Schlüssel vorhanden ist, wird der Befehl damit verknüpft Der Kopf des Listenwerts wird in den im Parameter angegebenen Wert eingefügt, andernfalls findet keine Operation statt. | Die Anzahl der Elemente in der verknüpften Liste nach dem Einfügen. |
LRANGE-Taste Start Stop | O(S+N) | S in der Zeitkomplexität ist der durch den Startparameter dargestellte Offset, N Stellt dar die Anzahl der Elemente. Die Parameter start und end dieses Befehls basieren beide auf 0. Das heißt, 0 stellt das erste Element am Kopf (ganz links) der verknüpften Liste dar. Der Startwert kann auch ein negativer Wert sein. -1 stellt das letzte Element in der verknüpften Liste dar, also das Endelement, -2 stellt das vorletzte Element dar und so weiter. Wenn dieser Befehl Elemente abruft, werden auch die Elemente an der Start- und Endposition entfernt. Wenn der Wert von start größer ist als die Anzahl der Elemente in der verknüpften Liste, wird eine leere verknüpfte Liste zurückgegeben. Wenn der Wert von end größer als die Anzahl der Elemente ist, ruft dieser Befehl alle verbleibenden Elemente in der verknüpften Liste ab Anfang (einschließlich Anfang) ab. | Gibt eine Liste von Elementen innerhalb des angegebenen Bereichs zurück. |
LPOPkey | O(1) | Geben Sie das erste Element in der verknüpften Liste zurück, das dem angegebenen Schlüssel zugeordnet ist, d. h. das Kopfelement. Wenn der Schlüssel nicht existiert, geben Sie Null zurück. | Das Element an der Spitze der verknüpften Liste. |
LLENkey | O(1) | Gibt die Anzahl der Elemente in der verknüpften Liste zurück, die dem angegebenen Schlüssel zugeordnet sind, wenn der Schlüssel nicht vorhanden ist , 0 wird zurückgegeben. Wenn der mit dem Schlüssel verknüpfte Werttyp keine verknüpfte Liste ist, werden relevante Fehlerinformationen zurückgegeben. | Die Anzahl der Elemente in der verknüpften Liste |
LREMkey-Zählerwert | O(N) | N in der Zeitkomplexität bedeutet in der verknüpften Liste Die Anzahl der Elemente. Löschen Sie in der verknüpften Liste, die dem angegebenen Schlüssel zugeordnet ist, die ersten Zählelemente, deren Wert gleich value ist. Wenn die Anzahl größer als 0 ist, vom Anfang zum Ende durchlaufen und löschen. Wenn die Anzahl kleiner als 0 ist, vom Ende zum Anfang durchlaufen und löschen. Wenn count gleich 0 ist, löschen Sie alle Elemente in der verknüpften Liste, die gleich value sind. Wenn der angegebene Schlüssel nicht existiert, wird 0 direkt zurückgegeben. | Gibt die Anzahl der gelöschten Elemente zurück. |
LSETkey-Indexwert | O(N) | N in der Zeitkomplexität stellt die Anzahl der Elemente in der verknüpften Liste dar. Beim Festlegen der Kopf- oder Schwanzelemente beträgt die Zeitkomplexität jedoch O (1). Setzen Sie den Wert der angegebenen Position in der verknüpften Liste auf den neuen Wert, wobei 0 das erste Element, also das Kopfelement, und -1 das Endelement darstellt. Wenn der Indexwert Index die Anzahl der Elemente in der verknüpften Liste überschreitet, gibt dieser Befehl relevante Fehlerinformationen zurück. | |
LINDEX-Schlüsselindex | O(N) | N in der Zeitkomplexität bedeutet, das Element zu finden Die Zahl von Elementen, die durchlaufen werden müssen. Für Kopf- oder Schwanzelemente beträgt die zeitliche Komplexität O(1). Dieser Befehl gibt das Element an der angegebenen Position (Index) in der verknüpften Liste zurück. Der Index ist 0-basiert, was bedeutet, dass es sich um das Kopfelement handelt. Wenn der Schlüssel keiner verknüpften Liste zugeordnet ist, gibt dieser Befehl relevante Fehlerinformationen zurück. | Gibt das angeforderte Element zurück oder Null, wenn der Index außerhalb des Bereichs liegt. |
LTRIMkey Start Stop | O(N) | N steht für die Anzahl der gelöschten Elemente. Dieser Befehl behält nur Elemente innerhalb des angegebenen Bereichs bei und hält somit die Anzahl der Elemente im Link relativ konstant. Die Start- und Stoppparameter basieren beide auf 0, wobei 0 das Header-Element angibt. Wie andere Befehle können auch Start und Stopp negative Werte sein, und -1 stellt das Endelement dar. Wenn Start größer als das Ende der verknüpften Liste ist oder Start größer als Stop ist, meldet dieser Befehl keinen Fehler, sondern gibt eine leere verknüpfte Liste zurück und gleichzeitig wird der Schlüssel gelöscht. Wenn stop größer als die Anzahl der Elemente ist, werden alle verbleibenden Elemente von start beibehalten. | |
LINSERT-Taste VOR|NACH Pivotwert | O(N) | N in der Zeitkomplexität stellt die Anzahl der Durchläufe dar, die durchlaufen werden müssen bevor Sie den Elementdrehpunkt finden. Anzahl der Elemente. Dies bedeutet, dass die zeitliche Komplexität dieses Befehls O(1) beträgt, wenn sich der Pivot am Anfang oder am Ende der verknüpften Liste befindet. Die Funktion dieses Befehls besteht darin, den Elementwert in den Parameter vor oder nach dem Pivotelement einzufügen. Wenn der Schlüssel nicht vorhanden ist, führt dieser Befehl nichts aus. Wenn der mit dem Schlüssel verknüpfte Werttyp keine verknüpfte Liste ist, werden zugehörige Fehlerinformationen zurückgegeben. | Die Anzahl der Elemente in der verknüpften Liste nach erfolgreicher Einfügung. Wenn der Pivot nicht gefunden wird, wird -1 zurückgegeben. Wenn der Schlüssel nicht vorhanden ist, wird 0 zurückgegeben. |
RPUSH-Schlüsselwert [Wert ...] | O(1) | Fügen Sie Parameter am Ende des Listenwerts ein, der dem angegebenen Wert zugeordnet ist Schlüssel Alle Werte angegeben. Wenn der Schlüssel nicht vorhanden ist, erstellt dieser Befehl vor dem Einfügen eine leere verknüpfte Liste, die dem Schlüssel zugeordnet ist, und fügt dann die Daten vom Ende der verknüpften Liste ein. Wenn der Wert des Schlüssels nicht vom Typ einer verknüpften Liste ist, gibt dieser Befehl relevante Fehlerinformationen zurück. | Die Anzahl der Elemente in der verknüpften Liste nach dem Einfügen |
RPUSHX-Schlüsselwert | O(1) | Nur wenn angegeben im Parameter Nur wenn der Schlüssel vorhanden ist, fügt der Befehl den im Parameter angegebenen Wert am Ende des zugehörigen Listenwerts ein, andernfalls wird keine Operation ausgeführt. | Die Anzahl der Elemente in der verknüpften Liste nach dem Einfügen. |
RPOPkey | O(1) | Geben Sie das letzte Element in der verknüpften Liste zurück, das dem angegebenen Schlüssel zugeordnet ist, d. h. das Schwanzelement. Wenn der Schlüssel nicht existiert, geben Sie Null zurück. | Das Element am Ende der verknüpften Liste. |
RPOPLPUSH Quellziel | O(1) | Fügen Sie ein Element atomar vom Ende der verknüpften Liste ein, die dem Quellschlüssel zugeordnet ist, und dann pop the Das Element wird am Anfang der verknüpften Liste eingefügt, die dem Zielschlüssel zugeordnet ist. Wenn der Quellschlüssel nicht vorhanden ist, gibt der Befehl Null zurück und es werden keine anderen Vorgänge ausgeführt. Wenn Quelle und Ziel derselbe Schlüssel sind, entspricht dies dem atomaren Verschieben des Endelements in der zugehörigen verknüpften Liste an den Kopf der verknüpften Liste. | Gibt entfernte und eingefügte Elemente zurück. |
3. Befehlsbeispiele:
1. LPUSH/LPUSHX/LRANGE:
/> redis-cli #在Shell提示符下启动redis客户端工具。 redis 127.0.0.1:6379> del mykey (integer) 1 #mykey键并不存在,该命令会创建该键及与其关联的List,之后在将参数中的values从左到右依次插入。 redis 127.0.0.1:6379> lpush mykey a b c d (integer) 4 #取从位置0开始到位置2结束的3个元素。 redis 127.0.0.1:6379> lrange mykey 0 2 1) "d" 2) "c" 3) "b" #取链表中的全部元素,其中0表示第一个元素,-1表示最后一个元素。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "d" 2) "c" 3) "b" 4) "a" #mykey2键此时并不存在,因此该命令将不会进行任何操作,其返回值为0。 redis 127.0.0.1:6379> lpushx mykey2 e (integer) 0 #可以看到mykey2没有关联任何List Value。 redis 127.0.0.1:6379> lrange mykey2 0 -1 (empty list or set) #mykey键此时已经存在,所以该命令插入成功,并返回链表中当前元素的数量。 redis 127.0.0.1:6379> lpushx mykey e (integer) 5 #获取该键的List Value的头部元素。 redis 127.0.0.1:6379> lrange mykey 0 0 1) "e"
2. LPOP/LLEN:
redis 127.0.0.1:6379> lpush mykey a b c d (integer) 4 redis 127.0.0.1:6379> lpop mykey "d" redis 127.0.0.1:6379> lpop mykey "c" #在执行lpop命令两次后,链表头部的两个元素已经被弹出,此时链表中元素的数量是2 redis 127.0.0.1:6379> llen mykey (integer) 2
3. LREM/ LSET/LINDEX/LTRIM:
#为后面的示例准备测试数据。 redis 127.0.0.1:6379> lpush mykey a b c d a c (integer) 6 #从头部(left)向尾部(right)变量链表,删除2个值等于a的元素,返回值为实际删除的数量。 redis 127.0.0.1:6379> lrem mykey 2 a (integer) 2 #看出删除后链表中的全部元素。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "c" 2) "d" 3) "c" 4) "b" #获取索引值为1(头部的第二个元素)的元素值。 redis 127.0.0.1:6379> lindex mykey 1 "d" #将索引值为1(头部的第二个元素)的元素值设置为新值e。 redis 127.0.0.1:6379> lset mykey 1 e OK #查看是否设置成功。 redis 127.0.0.1:6379> lindex mykey 1 "e" #索引值6超过了链表中元素的数量,该命令返回nil。 redis 127.0.0.1:6379> lindex mykey 6 (nil) #设置的索引值6超过了链表中元素的数量,设置失败,该命令返回错误信息。 redis 127.0.0.1:6379> lset mykey 6 hh (error) ERR index out of range #仅保留索引值0到2之间的3个元素,注意第0个和第2个元素均被保留。 redis 127.0.0.1:6379> ltrim mykey 0 2 OK #查看trim后的结果。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "c" 2) "e" 3) "c"
4. LINSERT:
#删除该键便于后面的测试。 redis 127.0.0.1:6379> del mykey (integer) 1 #为后面的示例准备测试数据。 redis 127.0.0.1:6379> lpush mykey a b c d e (integer) 5 #在a的前面插入新元素a1。 redis 127.0.0.1:6379> linsert mykey before a a1 (integer) 6 #查看是否插入成功,从结果看已经插入。注意lindex的index值是0-based。 redis 127.0.0.1:6379> lindex mykey 0 "e" #在e的后面插入新元素e2,从返回结果看已经插入成功。 redis 127.0.0.1:6379> linsert mykey after e e2 (integer) 7 #再次查看是否插入成功。 redis 127.0.0.1:6379> lindex mykey 1 "e2" #在不存在的元素之前或之后插入新元素,该命令操作失败,并返回-1。 redis 127.0.0.1:6379> linsert mykey after k a (integer) -1 #为不存在的Key插入新元素,该命令操作失败,返回0。 redis 127.0.0.1:6379> linsert mykey1 after a a2 (integer) 0
#删除该键,以便于后面的测试。 redis 127.0.0.1:6379> del mykey (integer) 1 #从链表的尾部插入参数中给出的values,插入顺序是从左到右依次插入。 redis 127.0.0.1:6379> rpush mykey a b c d (integer) 4 #通过lrange的可以获悉rpush在插入多值时的插入顺序。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "a" 2) "b" 3) "c" 4) "d" #该键已经存在并且包含4个元素,rpushx命令将执行成功,并将元素e插入到链表的尾部。 redis 127.0.0.1:6379> rpushx mykey e (integer) 5 #通过lindex命令可以看出之前的rpushx命令确实执行成功,因为索引值为4的元素已经是新元素了。 redis 127.0.0.1:6379> lindex mykey 4 "e" #由于mykey2键并不存在,因此该命令不会插入数据,其返回值为0。 redis 127.0.0.1:6379> rpushx mykey2 e (integer) 0 #在执行rpoplpush命令前,先看一下mykey中链表的元素有哪些,注意他们的位置关系。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "a" 2) "b" 3) "c" 4) "d" 5) "e" #将mykey的尾部元素e弹出,同时再插入到mykey2的头部(原子性的完成这两步操作)。 redis 127.0.0.1:6379> rpoplpush mykey mykey2 "e" #通过lrange命令查看mykey在弹出尾部元素后的结果。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "a" 2) "b" 3) "c" 4) "d" #通过lrange命令查看mykey2在插入元素后的结果。 redis 127.0.0.1:6379> lrange mykey2 0 -1 1) "e" #将source和destination设为同一键,将mykey中的尾部元素移到其头部。 redis 127.0.0.1:6379> rpoplpush mykey mykey "d" #查看移动结果。 redis 127.0.0.1:6379> lrange mykey 0 -1 1) "d" 2) "a" 3) "b" 4) "c"
4. Tipps zur verknüpften Listenstruktur:
Für den Wert der verknüpften Listenstruktur, Redis in In der offiziellen Dokumentation werden einige praktische Tipps gegeben, z. B. der Befehl RPOPLPUSH, und im Folgenden werden spezifische Erklärungen gegeben.
Redis-verknüpfte Listen werden häufig in Nachrichtenwarteschlangendiensten verwendet, um den Nachrichtenaustausch zwischen mehreren Programmen abzuschließen. Angenommen, eine Anwendung führt eine LPUSH-Operation aus, um der verknüpften Liste neue Elemente hinzuzufügen. Wir nennen ein solches Programm normalerweise einen „Produzenten“, während eine andere Anwendung eine RPOP-Operation ausführt, um Elemente aus der verknüpften Liste zu entfernen Das Programm wird als „Consumer“ bezeichnet. Wenn zu diesem Zeitpunkt das Verbraucherprogramm unmittelbar nach dem Herausnehmen des Nachrichtenelements abstürzt, weil die Nachricht herausgenommen und nicht normal verarbeitet wurde, können wir davon ausgehen, dass die Nachricht verloren gegangen ist, was zu Geschäftsverlusten führen kann Es kommt zu Inkonsistenzen und anderen Phänomenen. Mithilfe des Befehls RPOPLPUSH fügt das Verbraucherprogramm jedoch die Nachricht in die Sicherungswarteschlange ein, nachdem es die Nachricht aus der Hauptnachrichtenwarteschlange abgerufen hat, und löscht die Nachricht dann aus der Sicherungswarteschlange, nachdem das Verbraucherprogramm die normale Verarbeitungslogik abgeschlossen hat. Gleichzeitig können wir auch einen Daemon-Prozess bereitstellen. Wenn festgestellt wird, dass eine Nachricht in der Sicherungswarteschlange abgelaufen ist, kann sie wieder in die Hauptnachrichtenwarteschlange gestellt werden, damit andere Verbraucherprogramme die Verarbeitung fortsetzen können.
Das Obige ist das Redis-Tutorial (3): Datentyp auflisten Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!