Dieser Artikel vermittelt Ihnen relevantes Wissen über Redis, das hauptsächlich einige Vorteile und Eigenschaften von Redis vorstellt. Redis ist eine in ANSI C-Sprache geschriebene Open Source, entspricht dem BSD-Protokoll, unterstützt das Netzwerk und kann auf Speicher basieren. Werfen wir einen Blick darauf. Ich hoffe, es wird für alle hilfreich sein.
Empfohlenes Lernen: Redis-Video-Tutorial
Redis ist eine Open-Source-Schlüsselwertspeicherdatenbank, die in der Sprache ANSI C geschrieben ist, mit dem BSD-Protokoll kompatibel ist, Netzwerk-, speicherbasierte, verteilte und optionale Persistenz unterstützt und APIs in mehreren Sprachen bereitstellt.
Redis wird oft als Datenstrukturserver bezeichnet, da Werte Typen wie String, Hash, Liste, Sets und sortierte Sets sein können.
Funktionen von Redis:
In-Memory-Datenbank, schnell, unterstützt auch Datenpersistenz. Sie kann die Daten im Speicher auf der Festplatte speichern und zur Verwendung beim Neustart erneut laden.Das Mehrkanal-E/A-Multiplexing-Modell verwendet Select, Poll und Epoll, um die E/A-Ereignisse mehrerer Streams gleichzeitig zu überwachen. Im Leerlauf wird der aktuelle Thread blockiert Tritt ein E/A-Ereignis auf, wacht es aus dem Blockierungszustand auf, sodass das Programm alle Streams abfragt (epoll fragt nur die Streams ab, die das Ereignis tatsächlich ausgegeben haben) und verarbeitet nur die bereiten Streams der Reihe nach. Dieser Ansatz vermeidet viel von nutzlosen Operationen.
**Hier bezieht sich „mehrfach“ auf mehrere Netzwerkverbindungen und „Wiederverwendung“ auf die Wiederverwendung desselben Threads. ** Durch die Verwendung der Mehrkanal-E/A-Multiplexing-Technologie kann ein einzelner Thread mehrere Verbindungsanforderungen effizient verarbeiten (wodurch der Zeitverbrauch von Netzwerk-E/A minimiert wird), und Redis verarbeitet Daten im Speicher sehr schnell, was bedeutet, dass der Betrieb im Speicher erfolgt nicht zu einem Engpass werden, der die Leistung von Redis beeinträchtigt. Die oben genannten Punkte tragen hauptsächlich zum hohen Durchsatz von Redis bei.
Wir müssen zunächst verstehen, dass alle oben genannten Analysen eine Atmosphäre schaffen sollen, in der Redis schnell ist! In den offiziellen FAQ heißt es, dass die CPU nicht der Flaschenhals von Redis ist, da es sich bei Redis um einen speicherbasierten Vorgang handelt. Der Flaschenhals von Redis ist höchstwahrscheinlich die Größe des Maschinenspeichers oder der Netzwerkbandbreite. Da Single-Threading einfach zu implementieren ist und die CPU nicht zum Engpass wird, ist es logisch, eine Single-Thread-Lösung zu verwenden (die Verwendung von Multi-Threading verursacht schließlich große Probleme!).
redis 127.0.0.1:6379> SET rediskey redis OK redis 127.0.0.1:6379> GET rediskey "redis"
Redis-Hash ist eine Zuordnung von Tabellen und Hashes vom Typ String (Feld) und Wert (Wert). eignen sich besonders zur Aufbewahrung von Gegenständen.
Jeder Hash in Redis kann 232 - 1 Schlüssel-Wert-Paare (mehr als 4 Milliarden) speichern.
Die Redis-Liste ist eine einfache Liste von Zeichenfolgen, sortiert in der Einfügungsreihenfolge. Sie können ein Element am Kopf (links) oder am Ende (rechts) der Liste hinzufügen
Eine Liste kann bis zu 232 - 1 Elemente enthalten (4294967295, mehr als 4 Milliarden Elemente pro Liste).
redis 127.0.0.1:6379> LPUSH rediskey redis (integer) 1 redis 127.0.0.1:6379> LPUSH rediskey mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH rediskey mysql (integer) 3 redis 127.0.0.1:6379> LRANGE rediskey 0 10 1) "mysql" 2) "mongodb" 3) "redis"
Redis‘ Set ist eine ungeordnete Sammlung vom Typ String. Satzmitglieder sind eindeutig, was bedeutet, dass im Satz keine doppelten Daten vorkommen können.
Die Kodierung des Sammlungsobjekts kann Intset oder Hashtable sein.
Sammlungen in Redis werden über Hash-Tabellen implementiert, sodass die Komplexität des Hinzufügens, Löschens und Suchens O(1) beträgt.
Die maximale Anzahl von Mitgliedern in einer Sammlung beträgt 232 - 1 (4294967295, jede Sammlung kann mehr als 4 Milliarden Mitglieder speichern).
redis 127.0.0.1:6379> SADD rediskey redis (integer) 1 redis 127.0.0.1:6379> SADD rediskey mongodb (integer) 1 redis 127.0.0.1:6379> SADD rediskey mysql (integer) 1 redis 127.0.0.1:6379> SADD rediskey mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS rediskey 1) "mysql" 2) "mongodb" 3) "redis"
Redis geordnete Menge ist wie eine Menge auch eine Sammlung von Elementen vom Typ Zeichenfolge und erlaubt keine doppelten Mitglieder.
Der Unterschied besteht darin, dass jedem Element eine doppelte Typbewertung zugeordnet ist. Redis verwendet Scores, um die Mitglieder der Sammlung von klein nach groß zu sortieren.
Die Mitglieder eines bestellten Sets sind einzigartig, aber die Partituren können wiederholt werden.
Sets werden durch Hash-Tabellen implementiert, sodass die Komplexität des Hinzufügens, Löschens und Suchens O(1) beträgt. Die maximale Anzahl von Mitgliedern in einer Sammlung beträgt 232 – 1 (4294967295, jede Sammlung kann mehr als 4 Milliarden Mitglieder speichern).
Redis hat die HyperLogLog-Struktur in Version 2.8.9 hinzugefügt.
Redis HyperLogLog ist ein Algorithmus für Kardinalitätsstatistiken. Der Vorteil von HyperLogLog besteht darin, dass der zur Berechnung der Kardinalität erforderliche Platz immer fest und sehr klein ist.
In Redis benötigt jeder HyperLogLog-Schlüssel nur 12 KB Speicher, um die Kardinalität von fast 2^64 verschiedenen Elementen zu berechnen. Dies steht in scharfem Gegensatz zu einer Sammlung, die bei der Berechnung der Kardinalität mehr Speicher verbraucht. Je mehr Elemente vorhanden sind, desto mehr Speicher wird verbraucht.
Da HyperLogLog jedoch nur die Kardinalität basierend auf den Eingabeelementen berechnet und die Eingabeelemente nicht selbst speichert, kann HyperLogLog nicht jedes Element der Eingabe wie eine Sammlung zurückgeben.
Zum Beispiel der Datensatz {1, 3, 5, 7, 5, 7, 8}, dann ist der Kardinalitätssatz dieses Datensatzes {1, 3, 5,7, 8}, die Kardinalität (sich nicht wiederholende Elemente) beträgt 5. Bei der Kardinalitätsschätzung geht es darum, die Kardinalität schnell innerhalb des akzeptablen Fehlerbereichs zu berechnen.
Das folgende Beispiel zeigt den Arbeitsprozess von HyperLogLog:
//添加指定元素到 HyperLogLog 中。 redis 127.0.0.1:6379> PFADD rediskey "redis" 1) (integer) 1 redis 127.0.0.1:6379> PFADD rediskey "mongodb" 1) (integer) 1 redis 127.0.0.1:6379> PFADD rediskey "mysql" 1) (integer) 1 //添加指定元素到 HyperLogLog 中。 redis 127.0.0.1:6379> PFCOUNT rediskey (integer) 3
Redis Veröffentlichen und Abonnieren (Pub/Sub) ist ein Nachrichtenkommunikationsmodell: Der Absender (Pub) sendet eine Nachricht, die Subscriber (sub) ), um Nachrichten zu empfangen.
Redis-Kunden können beliebig viele Kanäle abonnieren.
Die folgende Abbildung zeigt die Beziehung zwischen Kanal Kanal1 und den drei Clients, die diesen Kanal abonnieren – Client2, Client5 und Client1:
Das folgende Beispiel zeigt, wie Veröffentlichen und Abonnieren funktioniert: Zwei Redis-Cli Clients müssen geöffnet werden.
In unserem Beispiel haben wir einen Abonnementkanal mit dem Namen runoobChat:
erstelltredis 127.0.0.1:6379> SUBSCRIBE runoobChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "runoobChat" 3) (integer) 1
现在,我们先重新开启个 redis 客户端,然后在同一个频道 runoobChat 发布两次消息,订阅者就能接收到消息。
redis 127.0.0.1:6379> PUBLISH runoobChat "Redis PUBLISH test" (integer) 1 redis 127.0.0.1:6379> PUBLISH runoobChat "Learn redis by runoob.com" (integer) 1 # 订阅者的客户端会显示如下消息 1) "message" 2) "runoobChat" 3) "Redis PUBLISH test" 1) "message" 2) "runoobChat" 3) "Learn redis by runoob.com"
gif 演示如下:
runoobChat
频道。Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:
一个事务从开始到执行会经历以下三个阶段:
以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C++" 3) "Programming"
单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
这是官网上的说明 From redis docs on transactions:
It’s important to note that even when a command fails, all the other commands in the queue are processed – Redis will not stop the processing of commands.
比如:
redis 127.0.0.1:7000> multi OK redis 127.0.0.1:7000> set a aaa QUEUED redis 127.0.0.1:7000> set b bbb QUEUED redis 127.0.0.1:7000> set c ccc QUEUED redis 127.0.0.1:7000> exec 1) OK 2) OK 3) OK
如果在 set b bbb 处失败,set a 已成功不会回滚,set c 还会继续执行。
Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second"
Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。
Redis GEO 操作方法有:
redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania" (integer) 2 redis> GEODIST Sicily Palermo Catania "166274.1516" redis> GEORADIUS Sicily 15 37 100 km 1) "Catania" redis> GEORADIUS Sicily 15 37 200 km 1) "Palermo" 2) "Catania" redis>
Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。
Redis Stream 的结构如下所示,它有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容:
每个 Stream 都有唯一的名称,它就是 Redis 的 key,在我们首次使用 xadd 指令追加消息时自动创建。
上图解析:
Redis ist ein TCP-Dienst, der auf dem Client-Server-Modell und dem Anforderungs-/Antwortprotokoll basiert. Das bedeutet, dass eine Anfrage normalerweise die folgenden Schritte durchläuft:
Die Redis-Pipeline-Technologie ermöglicht es dem Client, weiterhin Anfragen an den Server zu senden, wenn der Server nicht antwortet, und liest schließlich die Antworten von allen Servern gleichzeitig.
Empfohlenes Lernen: Redis-Video-Tutorial
Das obige ist der detaillierte Inhalt vonLassen Sie uns über die Vorteile und Funktionen von Redis sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!