Redka – Redis mit SQLite neu implementiert
(github.com/nalgeon)- Redka verfolgt das Ziel, die Vorteile von Redis mit SQLite neu zu implementieren und dabei mit der Redis-API kompatibel zu bleiben
- Wichtige Merkmale:
- Die Daten müssen nicht in die Größe des RAM passen
- Unterstützung für ACID-Transaktionen
- Bessere Datenabfrage- und Reporting-Funktionen über SQL-Views
- Unterstützung sowohl für In-Process-Server (Go-API) als auch für Standalone-Server (RESP)
- Unterstützung für Redis-kompatible Befehle und Protokolle
- Das Projekt befindet sich derzeit noch in Entwicklung; Informationen zum aktuellen Support-Status und zur Roadmap finden sich in den untenstehenden Dokumenten
Unterstützte Befehle
- Redka hat das Ziel, die fünf zentralen Redis-Datentypen String, List, Set, Hash und Sorted Set zu unterstützen
- String, Hash, Key-Management und Transaktionsbefehle werden bereits unterstützt, List, Set und Sorted Set befinden sich noch in Entwicklung
- Eine detaillierte Liste der Befehle findet sich im Originaltext
Installation
Standalone-Server
- Die zur jeweiligen Plattform passende Binärdatei von der Release-Seite herunterladen und ausführen
- Bei Verwendung von Docker das Image mit
docker pull nalgeon/redkaherunterladen
Go-Modul
- Das Modul mit
go get github.com/nalgeon/redkainstallieren - Als SQLite-Treiber
github.com/mattn/go-sqlite3odermodernc.org/sqliteverwenden
Verwendung
Standalone-Server
- Die heruntergeladene Binärdatei im Format
redka [-h host] [-p port] [db-path]ausführen- Standardwerte sind Host
localhost, Port6379und kein DB-Pfad (In-Memory)
- Standardwerte sind Host
- Bei Verwendung von Docker mit dem Befehl
docker runstarten. Weitere Optionen siehe Originaltext - Nach dem Start des Servers kann die Verbindung über Redis-kompatible Clients wie
redis-cli,redis-pyodergo-rediserfolgen
In-Process-Server
- Mit der Funktion
redka.Open()ein DB-Objekt erzeugen. Der Import des Treibers ist erforderlich - Durch Aufruf der Methoden des Objekts
redka.DBverschiedene Befehle ausführen - Transaktionen mit den Methoden
View(schreibgeschützt) undUpdate(schreibbar) verarbeiten
Persistenz
- Redka speichert Daten in der SQLite-Datenbank mithilfe der Tabellen
rkey,rstringundrhash - Über Views für die jeweiligen Datentypen (
vstring,vhashusw.) lassen sich Daten per SQL abfragen
Performance
- Vergleich der Performance von Redis und Redka mit dem Tool
redis-benchmark- Redka ist bei SET etwa 6-mal und bei GET etwa 2-mal langsamer
- Zeigt dennoch eine Leistung von etwa 23K Writes und 57K Reads pro Sekunde
- Beim Ausführen in Containern kann es zu Leistungseinbußen kommen
Roadmap
- Für das Release 1.0 ist eine Implementierung geplant, die sich auf die Hauptfunktionen aus der Zeit von Redis 2.x konzentriert
- Unterstützung für String, Hash, Key-Management und Transaktionen ist abgeschlossen
- Sorted Set befindet sich in Entwicklung
- List und Set sind geplant
- In zukünftigen Versionen sind Datentypen wie Stream, HyperLogLog und Geo sowie Pub/Sub vorgesehen
- Für Lua-Scripting, Authentifizierung/ACL, Multi-DB, Watch/Unwatch usw. ist keine Implementierung geplant
- Cluster- und Sentinel-Funktionen sollen ebenfalls nicht implementiert werden
Meinung von GN⁺
- Der Ansatz von Redka, weitgehend Redis-kompatibel zu sein und gleichzeitig Persistenz zu bieten, ist interessant. Auch die Unterstützung für ACID-Transaktionen dürfte ein Vorteil sein.
- Bei der Performance reicht es zwar nicht an Redis heran, aber wenn Persistenz benötigt wird, scheint es eine durchaus erwägenswerte Alternative zu sein.
- Da sich das Projekt jedoch noch in einem frühen Entwicklungsstadium befindet, sollte man die Stabilität weiter beobachten; auch die in der Roadmap fehlenden Funktionen sind bei einer tatsächlichen Einführung zu berücksichtigen.
- Für reine In-Memory-Anwendungen wird es Redis letztlich wohl nicht schlagen, aber als auf SQLite basierende Persistenzschicht könnte es sich als nützlich erweisen.
- Derzeit steigt die Nachfrage nach schlanken Stacks in Edge-Computing-Umgebungen; in solchen Bereichen könnte man Redka anstelle von Redis ausprobieren.
2 Kommentare
Das wäre wohl nützlich, wenn man Redis an einen Scheduler anbinden muss, haha.
Hacker-News-Kommentare
SetMaxConnections(1)verwendet, doch im WAL-Modus (der hier aktiv ist) unterstützt SQLite Schreibvorgänge, die Lesezugriffe nicht blockieren, sodass es Vorteile bringen könnte, Lese-Nebenläufigkeit zuzulassen