Erste Schritte mit Rocksdb und Python

In diesem Beitrag werde ich über RocksDB sprechen.

RocksDB ist ein von Facebook entwickeltes einbettbares persistentes Key-Value-Store-System. Es wurde ursprünglich von LevelDB abgezweigt, das von Google erstellt wurde.

Entsprechend Wikipedia:

RocksDB ist eine leistungsstarke eingebettete Datenbank für Schlüsselwertdaten. Es ist ein Fork von Googles LevelDB, der optimiert ist, um viele CPU-Kerne auszunutzen und schnellen Speicher wie Solid-State-Laufwerke (SSD) effizient für Input/Output (I/O)-gebundene Workloads zu nutzen. Es basiert auf einer protokollstrukturierten Merge-Tree (LSM-Baum)-Datenstruktur. Es ist in C++ geschrieben und bietet offizielle Sprachbindungen für C++, C und Java; neben vielen Sprachbindungen von Drittanbietern.

RocksDB wurde speziell für Flash-Laufwerke und schnelle Speicher für den Datenzugriff mit geringer Latenz optimiert. Wie Redis speichert auch RocksDB In-Memory-Daten, aber im Gegensatz zu Redis ist es kein Server, sondern eine einbettbare Bibliothek ähnlich wie SQLite. RocksDB wird ausgiebig zum Speichern persistenter Daten auf SSDs bei Facebook und von verschiedenen Diensten verwendet, die Online-Abfragen auf Festplatten bedienen.

Die Nutzungsmöglichkeiten von RocksDB sind endlos, Sie können es als Speicher-Engine verwenden, die Daten speichert und eine personalisierte Homepage für jeden Benutzer generiert. Anstatt also mehrere SELECTs-Abfragen basierend auf dem Benutzer zu machen, der die Datenbank belastet, können Sie diese Daten im Schlüssel/Wert-Format speichern, wobei die Benutzer-ID als Schlüssel dienen könnte, der alle Daten in Formaten wie JSON enthält.

In diesem Beitrag erörtere ich die grundlegende Verwendung von RocksDB unabhängig von einem bestimmten Anwendungsfall und wie Sie es in Ihren Python-Anwendungen verwenden können.

Installation und Einrichtung

Um RocksDB in Python zu verwenden, muss RocksDB auf Ihrem System installiert sein, und dann können Sie mit Hilfe der Python-Bindung von RocksDB in Ihren Programmen auf RocksDB zugreifen. Da ich nicht mit meiner Mac-Umgebung herumspielen wollte, habe ich ein Debian-basiertes Python-Image heruntergeladen und RocksDB darin installiert. Unten sind die Schritte. Installieren Sie zuerst die erforderlichen Abhängigkeiten und RocksDB selbst:

apt install rocksdb-tools librocksdb5.17 librocksdb-dev libsnappy-dev liblz4-dev

Ab sofort, librocksdb5.17 war die neueste Version, die mir in Docker zur Verfügung stand.

und dann

pip install python-rocksdb

Ich habe meinen VS-Code mit dem Remote-Container verbunden, sodass ich direkt im Container codieren kann. Verwenden Dies VSCode-Erweiterung für diesen Zweck und Befestigen Sie Ihren Behälter. So sieht mein VSCode aus, nachdem er mit einem Remote-Container verbunden und ein remote Docker-basierter Python-Interpreter ausgewählt wurde.

Süss! nicht wahr?

Entwicklung

Lassen Sie uns die Bibliothek importieren und sehen, ob sie wirklich funktioniert oder nicht

import rocksdb

if __name__ == " __main__":
    print(rocksdb)

Wenn die Dinge wirklich installiert sind, wird es wie folgt ausgegeben:

root@9f7d3fc73b74:/code# /usr/local/bin/python /code/main.py
<module 'rocksdb' from '/usr/local/lib/python3.9/site-packages/rocksdb/ __init__.py'>

Lassen Sie uns weitermachen

if __name__ == " __main__":
    db = rocksdb.DB("test.db", rocksdb.Options(create_if_missing=True))
    db.put(b"a", b"ROFL")
    print(db.get(b"a").decode("utf-8"))

Die erste Zeile öffnet die DB-Datei mit bestimmten Optionen. Hier habe ich eingestellt create_if_missing zu True Datei nicht gefunden Fehler zu vermeiden. Dann stelle ich die ein a Schlüssel mit dem Text ROFL. Wenn Sie bemerken, dass ich Byte-Typ verwende b hier sowohl für Schlüssel als auch für Werte. RocksDB unterstützt Byte-Stream für Schlüssel anstelle von Zeichenfolgen oder anderen Datentypen. Ich habe es später in a umgewandeltstr durch Anruf decode('utf-8)

Mal sehen, was in dem Ordner passiert, in dem die DB erstellt wurde. Das erste, was mir auffiel, war für mich schockierend, dass die test.db war eigentlich keine Datei, sondern ein Ordner.

root@9f7d3fc73b74:/code# ls -la
total 16
drwxr-xr-x 3 root root 4096 Oct 3 15:24 .
drwxr-xr-x 1 root root 4096 Oct 3 13:37 ..
-rw-r--r-- 1 root root 180 Oct 3 15:20 main.py
drwxr-xr-x 2 root root 4096 Oct 3 15:24 test.db
root@9f7d3fc73b74:/code#

Wenn Sie ausführen cd test.db und Listendateien zeigt es Folgendes:

root@9f7d3fc73b74:/code/test.db# ls -l
total 152
-rw-r--r-- 1 root root 27 Oct 3 15:24 000003.log
-rw-r--r-- 1 root root 16 Oct 3 15:24 CURRENT
-rw-r--r-- 1 root root 37 Oct 3 15:24 IDENTITY
-rw-r--r-- 1 root root 0 Oct 3 15:24 LOCK
-rw-r--r-- 1 root root 15695 Oct 3 15:24 LOG
-rw-r--r-- 1 root root 13 Oct 3 15:24 MANIFEST-000001
-rw-r--r-- 1 root root 4721 Oct 3 15:24 OPTIONS-000005

Es enthält eine Protokolldatei, eine Optionsdatei und einige mehr. Sehen wir uns den Inhalt von an 000003.log Datei.

root@9f7d3fc73b74:/code/test.db# cat 000003.log 
���aROFLroot@9f7d3fc73b74:/code/test.db#

Wie Sie sich vorgestellt haben, werden Daten nicht im Klartextformat gespeichert. Sie können deutlich ein _a(Key) _and sehen ROFL(Wert) in komprimiertem Binärformat gespeichert. CURRENT informiert über das neueste Manifest-Protokoll.

root@9f7d3fc73b74:/code/test.db# cat CURRENT 
MANIFEST-000001

IDENTITY verfolgt Änderungen. In meinem Fall zeigt es:

root@9f7d3fc73b74:/code/test.db# cat IDENTITY 
c55f9d31-f622-4335-8cbf-f3ca9ce324ef

Dann ein 0-Byte SPERREN Datei. In RocksDB kann nur ein einzelner Prozess die Datei öffnen, daher kann ein einzelner Prozess Daten schreiben. PROTOKOLL Datei protokolliert, wie der Name schon sagt, alles. Das MANIFEST-000001 hatte nichts lesbares drin. Die nächste Datei ist OPTIONS-000005, die alle verfügbaren Optionen mit ihren aktuellen Werten enthält. Beim Ausführen der grep Befehle zeigt es folgendes:

root@9f7d3fc73b74:/code/test.db# cat OPTIONS-000005 | grep missing
  create_missing_column_families=false
  create_if_missing=true

Wie du sehen kannst,create_if_missing ist eingestellt auf true was ganz offensichtlich ist.

Wenn Sie weiter an den Interna interessiert sind, können Sie sie besuchen Dies Wiki-Seite.

Ebenso können Sie einen Schlüssel löschen.

db.delete(b"a")
print(db.get(b"a").decode("utf-8"))

Beim Ausführen gibt es den folgenden Fehler aus:

root@9f7d3fc73b74:/code/test.db# /usr/local/bin/python /code/main.py
ROFL
Traceback (most recent call last):
  File "/code/main.py", line 8, in <module>
    print(db.get(b"a").decode("utf-8"))
AttributeError: 'NoneType' object has no attribute 'decode'
root@9f7d3fc73b74:/code/test.db#

Seit der a Schlüssel wurde bereits entfernt, beim Zugriff darauf wurde eine Ausnahme ausgelöst. Die C++- und Java-Portierung bietet auch die Möglichkeit von TtlDB mit dem Sie ein Ablaufdatum für die Schlüssel festlegen können, eine Funktion, die Sie für die Verwendung von RocksDB als Web-Cache verwenden können. Leider ist es immer noch nicht in Python-Bindungen verfügbar.

Fazit

In diesem Beitrag habe ich RocksDB als Schlüssel/Wert-Speicher vorgestellt. RocksDB wird auch als Speicher-Engine verwendet und wird von DB-Systemen wie ArangoDB, MyRocks (MySQL Storage Engine basierend auf RocksDB), CockroachDB und anderen verwendet. Sie können es als Ersatz für verwenden Speicher wenn Sie Flash-Speichergeräte verwenden. Hier ist eine umfassende aufführen der RocksDB-Nutzung.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *