Bun SQLite Key-Value Store

Der superschnelle Key-Value Speicher mit SQLite, der bun:sqlite und v8 als schnellen JSON-Ersatz verwendet, ist fertig.

Bun SQLite Key-Value Store

In den letzten paar Tagen hatte ich mich zurückgezogen und ausschließlich an diesem Projekt gearbeitet. Ich brauchte einen schnellen, aber einfachen Datenspeicher für meine Projekte mit Bun.

Die letzte Datenbank, mit der ich experimentierte (LMDB), hat mich kläglich im Stich gelassen, als ich komplexere URLs speichern wollte. Ein Test mit bun:sqlite zeigte, dass es ausgereift ist und "Sonderzeichen" keine Probleme darstellen. Erstaunlicherweise war es in meinem Fall sogar schneller als LMDB.

Die Idee für das neue Projekt hatte ich von bun-sqlite-cache und bun-kv. Zuerst wollte ich an diesen Projekten mitarbeiten, erkannte aber schnell, dass ich mehr wollte. Daraus ist Bun-SQLite-Key-Value entstanden, das jetzt endlich fertig ist.

Es handelt sich dabei um ein kleines Paket, das man als Bun-Programmierer einfach mit diesem Befehl installieren kann:

bun add bun-sqlite-key-value

Schon kann man es im eigenen Programm entweder als Cache im Speicher oder als Datenspeicher auf der Festplatte nutzen. Mit TTL (Time To Live) ist ein automatisches Löschen der Werte eingebaut, damit sich der Cache selbst leert.

Hier ein kleines Beispiel, wie einfach es benutzt werden kann:

import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("my-key", [1, 2, 3, 4])

const value = store.get("my-key")

console.log(value)  // -> [ 1, 2, 3, 4 ]

Falls ich dein Interesse geweckt haben sollte, findest du hier alle Informationen und viele Beispiele zu Bun-SQLite-Key-Value.

Mit SQLite steht ein solider und gut getesteter Unterbau zur Verfügung. SQLite kümmert sich zuverlässig um das Speichern und Lesen der Daten – sowohl für kurze Strings als auch für größere BLOBs. Es bietet ein robustes Fundament, auf dem aufgebaut werden kann. Auch wenn SQLite nicht voll ausgereizt wird und keine Relationen zwischen Tabellen benötigt werden, stellt dies keinen Nachteil dar.

In Bun-SQLite-Key-Value habe ich etwas eingebaut, was ich bei Redis zu schätzen lernte. Die Rückgabe aller Einträge, deren "Key" mit einem bestimmten Wert beginnt. So kann man zum Beispiel alle Keys von Ländern mit "country:" beginnen lassen (z.B. "country:Österreich", "country:Deutschland") und später mit einem einfachen Befehl wieder abrufen.

const countrys = store.getValues("country:")

Das erleichtert es, auch komplexere Daten, schnell auffindbar, in einer einzigen Key-Value-Liste abzulegen. Weiters hindert dich niemand daran, mehrere Datenbanken offenzuhalten. Das hat sogar Geschwindigkeitsvorteile, da gleichzeitig in mehrere Datenbanken geschrieben werden kann. Man kann problemlos einen Store für das Caching, einen für die Settings und einen für die Arbeitsdaten verwenden.

Auch das Speichern von Bildern in die Datenbank ist kein Problem. Bilder sind meistens nur ein paar Megabyte groß. Es dauert nicht lange, diese zu speichern (im Millisekundenbereich). Bei SQLite gibt es öfter die Überlegung, dass während des Speicherns kein anderer Prozess gleichzeitig auch etwas speichern kann. Der andere Prozess muss so lange warten, bis der erste Prozess fertig ist. Aber ganz ehrlich, ich habe in meinem ganzen Leben nur wenige (oder gar keine) Programme geschrieben, in denen das ein bemerkbarer Nachteil gewesen wäre. Aber du solltest es zumindest wissen und bedenken.

Falls dir dieses Projekt gefällt, würde es mich freuen, wenn du einen ⭐ im GitHub-Projekt hinterlassen würdest. Vielen Dank! 😃