Heim  >  Artikel  >  Datenbank  >  Lassen Sie uns über die Vorteile und Funktionen von Redis sprechen

Lassen Sie uns über die Vorteile und Funktionen von Redis sprechen

WBOY
WBOYnach vorne
2022-05-16 18:04:094536Durchsuche

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

Was ist Redis? Remote Dictionary Server (Redis) ist ein von Salvatore Sanfilippo geschriebenes Schlüsselwertspeichersystem, bei dem es sich um eine plattformübergreifende, nicht relationale Datenbank handelt.

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.
  • Redis unterstützt nicht nur einfache Daten vom Typ Schlüsselwert, sondern bietet auch die Speicherung von Datenstrukturen wie Liste, Menge, Zset und Hash.
  • Redis unterstützt die Datensicherung, also die Datensicherung im Master-Slave-Modus.
  • Transaktionen unterstützen
  • Vorteile von Redis:

Extrem hohe Leistung – Redis kann mit einer Geschwindigkeit von 110.000 Mal/s lesen und mit einer Geschwindigkeit von 81.000 Mal/s schreiben.
  • Rich-Datentypen – Redis unterstützt Datentypoperationen vom Typ Strings, Listen, Hashes, Mengen und geordnete Mengen für binäre Fälle.
  • Atomic – Alle Operationen von Redis sind atomar und Redis unterstützt auch die atomare Ausführung nach der Zusammenführung mehrerer Operationen. (Transaktion)
  • Umfangreiche Funktionen – Redis unterstützt auch Publish/Subscribe, Benachrichtigungen, Schlüsselablauf und andere Funktionen.
  • Wie unterscheidet sich Redis von anderen Key-Value-Stores?

Redis verfügt über komplexere Datenstrukturen und bietet atomare Operationen für diese. Dies ist ein evolutionärer Weg, der sich von anderen Datenbanken unterscheidet. Die Datentypen von Redis basieren auf grundlegenden Datenstrukturen und sind für Programmierer transparent, ohne dass zusätzliche Abstraktionen erforderlich sind.
  • Redis wird im Speicher ausgeführt, kann jedoch auf der Festplatte gespeichert werden. Daher muss der Speicher abgewogen werden, wenn verschiedene Datensätze mit hoher Geschwindigkeit gelesen und geschrieben werden, da die Datenmenge nicht größer als der Hardwarespeicher sein darf. Ein weiterer Vorteil von In-Memory-Datenbanken besteht darin, dass der Betrieb im Speicher im Vergleich zu denselben komplexen Datenstrukturen auf der Festplatte sehr einfach ist, sodass Redis viele Dinge mit hoher interner Komplexität erledigen kann. Außerdem sind sie im Hinblick auf das Festplattenformat kompakt und werden durch Anhängen generiert, da sie keinen wahlfreien Zugriff erfordern.
  • Was sind die Unterschiede zwischen Memcache und Redis?

Speichermethode Memecache speichert alle Daten im Speicher und bleibt nach einem Stromausfall hängen. Ein Teil von Redis wird auf der Festplatte gespeichert, und Redis kann seine Daten beibehalten.
  1. Datenunterstützungstyp Memcached Alle Werte sind einfache Zeichenfolgen. Als Ersatz unterstützt Redis umfangreichere Datentypen und stellt Listen, Sätze und Zset, Hash und bereit Andere Datenstrukturen werden mit unterschiedlichen zugrunde liegenden Modellen gespeichert. Die zugrunde liegenden Implementierungsmethoden und Anwendungsprotokolle für die Kommunikation mit Clients sind unterschiedlich. Redis hat direkt einen eigenen VM-Mechanismus erstellt, denn wenn das allgemeine System Systemfunktionen aufruft, verschwendet es eine gewisse Zeit für das Verschieben und Anfordern.
  2. Die Wertgröße ist unterschiedlich: Redis kann maximal 512 MB erreichen; der Memcache beträgt nur 1 MB.
  3. Redis ist viel schneller als Memcached
  4. Redis unterstützt Datensicherung, also Datensicherung im Master-Slave-Modus.
  5. Warum ist Redis so schnell? 1. Die meisten Anfragen basieren vollständig auf dem Speicher und sind reine Speicheroperationen, sehr schnell. Die Daten werden im Speicher gespeichert, ähnlich wie bei HashMap. Der Vorteil von HashMap besteht darin, dass die Datenstruktur einfach ist und die Datenoperation einfach ist Die Struktur in Redis ist speziell entwickelt
  6. 3. Durch die Verwendung eines einzelnen Threads werden unnötige Kontextwechsel und Konkurrenzbedingungen vermieden. Es besteht keine Notwendigkeit, verschiedene Sperrprobleme zu berücksichtigen Sperrenfreigabe, kein Leistungsverbrauch durch möglichen Deadlock

4 Verwenden Sie verschiedene zugrunde liegende Modelle und die zugrunde liegenden Implementierungsmethoden Die Anwendungsprotokolle für die Kommunikation zwischen Clients sind unterschiedlich, da das allgemeine System beim Verschieben und Anfordern eine gewisse Zeit verschwendet. O Multiplexing-Modell

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.

Warum ist Redis also Single-Threaded?

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-Datentypen und -Befehle

1. String (String)

redis 127.0.0.1:6379> SET rediskey redis
OK
redis 127.0.0.1:6379> GET rediskey
"redis"

2. Hash (Hash)

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.

3. Liste (Liste)

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"

4. Set

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"

5. Sortierte Menge (sortierte Menge)

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).

6. HyperLogLog

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.

Was ist eine Kardinalität?

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.

Beispiel

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

7. Veröffentlichen und Abonnieren

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:

Beispiel

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:

erstellt

第一个 redis-cli 客户端

redis 127.0.0.1:6379> SUBSCRIBE runoobChat

Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "runoobChat"
3) (integer) 1

现在,我们先重新开启个 redis 客户端,然后在同一个频道 runoobChat 发布两次消息,订阅者就能接收到消息。

第二个 redis-cli 客户端

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 演示如下:

  • 开启本地 Redis 服务,开启两个 redis-cli 客户端。
  • 第一个 redis-cli 客户端输入 SUBSCRIBE runoobChat,意思是订阅 runoobChat 频道。
  • 第二个 redis-cli 客户端输入 PUBLISH runoobChat “Redis PUBLISH test” 往 runoobChat 频道发送消息,这个时候在第一个 redis-cli 客户端就会看到由第二个 redis-cli 客户端发送的测试消息。

8. 事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。

实例

以下是一个事务的例子, 它先以 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 还会继续执行。

9. 脚本

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"

10 GEO

Redis GEO 主要用于存储地理位置信息,并对存储的信息进行操作,该功能在 Redis 3.2 版本新增。

Redis GEO 操作方法有:

  • geoadd:添加地理位置的坐标。
  • geopos:获取地理位置的坐标。
  • geodist:计算两个位置之间的距离。
  • georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
  • georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
  • geohash:返回一个或多个位置对象的 geohash 值。
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>

11 Redis Stream

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 指令追加消息时自动创建。

上图解析:

  • Verbrauchergruppe: Verbrauchergruppe, erstellt mit dem Befehl XGROUP CREATE. Eine Verbrauchergruppe hat mehrere Verbraucher (Verbraucher).
  • last_delivered_id: Cursor: Jede Verbrauchergruppe hat einen Cursor last_delivered_id. Jeder Verbraucher, der die Nachricht liest, bewegt den Cursor last_delivered_id nach vorne.
  • pending_ids: Die Zustandsvariable des Verbrauchers, die zur Verwaltung der unbestätigten ID des Verbrauchers verwendet wird. pending_ids zeichnet Nachrichten auf, die vom Client gelesen wurden, aber noch keine Bestätigung (Bestätigungszeichen) erhalten haben.

Redis Pipeline-Technologie

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:

  • Der Client sendet eine Abfrageanforderung an den Server und wartet auf die Socket-Rückgabe, normalerweise im Blockierungsmodus, und wartet auf die Antwort des Servers.
  • Der Server verarbeitet den Befehl und gibt das Ergebnis an den Client zurück.

Redis-Pipeline-Technologie

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!

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