MMKV vs. AsyncStorage: schnellerer lokaler Key-Value-Speicher
AI generated
RN
native
React Native / New Architecture
MMKV vs. AsyncStorage
Schnellerer, synchroner lokaler Key-Value-Speicher über JSI

AsyncStorage verpackt jeden Lese- und Schreibzugriff in einen asynchronen Bridge-Aufruf, während MMKV, aufgebaut auf C++ und Memory-Mapped Files, synchron über JSI antwortet. Dieser Artikel vergleicht beide bei Geschwindigkeit, API-Design und Verschlüsselung und zeigt eine praktische Strategie, um bestehende AsyncStorage-Daten zu MMKV zu migrieren.

10 Min. Lesezeit MMKV AsyncStorage JSI

1. Wie AsyncStorage funktioniert: asynchrone Bridge-Aufrufe pro Zugriff

AsyncStorage speichert Daten je nach Plattform unterschiedlich, auf Android traditionell in einer SQLite-Datenbank, auf iOS in einer Sammlung von Property-List-Dateien, und jeder einzelne Zugriff, ob Lesen oder Schreiben, läuft über einen asynchronen Aufruf, der früher über die klassische Bridge und heute über ein TurboModule abgewickelt wird. Selbst das Lesen eines einzigen kleinen Strings erzeugt dabei einen kompletten asynchronen Round-Trip mit Promise-Auflösung.

Für gelegentliche Zugriffe, etwa das einmalige Speichern eines Auth-Tokens beim Login, ist dieser Overhead unproblematisch. Sobald eine App aber viele kleine Werte häufig liest oder schreibt, etwa Formularzustände, UI-Präferenzen oder Feature-Flags, die bei jedem Render geprüft werden, summiert sich die asynchrone Natur von AsyncStorage zu spürbarer Latenz und einer wachsenden Anzahl paralleler Promises.

2. Wie MMKV funktioniert: synchron, C++-basiert und mmap-gestützt

MMKV wurde ursprünglich von Tencent für WeChat entwickelt und basiert auf einer C++ Kernbibliothek, die Daten über memory-mapped files direkt in den Prozessspeicher einblendet, statt bei jedem Zugriff eine Datei zu öffnen, zu lesen oder zu schreiben. Über JSI wird MMKV direkt aus JavaScript synchron angesprochen, ganz ohne Promise, Bridge-Serialisierung oder Thread-Wechsel, was bei kleinen, häufigen Zugriffen einen fundamentalen Unterschied macht.

Da MMKV auf derselben nativen Ebene arbeitet, die auch von den Betriebssystemen für effizienten Dateizugriff genutzt wird, entfällt der Umweg über eine separate Datenbank-Engine wie SQLite komplett. Änderungen werden inkrementell in die zugrunde liegende Datei geschrieben, ohne dass jeder einzelne Schreibvorgang eine komplette Datei neu serialisieren muss.

3. Benchmark-Vergleich: Lese- und Schreibzeiten bei kleinen Werten

In öffentlich verfügbaren Benchmarks, unter anderem von der MMKV-Bibliothek selbst veröffentlicht, zeigt sich bei kleinen Werten wie einzelnen Strings oder Zahlen ein Geschwindigkeitsunterschied im Bereich von etwa dem Zehn- bis Dreißigfachen zugunsten von MMKV gegenüber AsyncStorage, insbesondere bei vielen aufeinanderfolgenden Einzelzugriffen. Der Unterschied fällt umso deutlicher aus, je kleiner die einzelnen Werte und je häufiger die Zugriffe sind.

Bei sehr großen, seltenen Schreibvorgängen, etwa dem einmaligen Ablegen eines mehrere Megabyte großen JSON-Blobs, relativiert sich der Unterschied etwas, da hier die reine Datenmenge stärker ins Gewicht fällt als der Protokoll-Overhead pro Aufruf. Für den typischen Anwendungsfall kleiner, häufiger Key-Value-Zugriffe bleibt MMKV aber in jedem realistischen Szenario klar im Vorteil.

4. API-Vergleich: von AsyncStorage-Promises zu MMKV-Synchronaufrufen

Der API-Unterschied zeigt sich direkt im Code: AsyncStorage erfordert für jeden Zugriff await oder eine .then()-Kette, während MMKV synchrone Methoden bereitstellt, die sofort einen Wert zurückgeben, ohne dass die aufrufende Funktion selbst asynchron sein muss. Das vereinfacht insbesondere Code, der Werte während des Renderns lesen möchte, was mit einer rein asynchronen API nur über Umwege wie initiale Lade-States möglich ist.

Das folgende Beispiel stellt beide APIs für denselben Anwendungsfall, das Speichern und Lesen eines Auth-Tokens, direkt gegenüber.


// AsyncStorage: jeder Zugriff ist asynchron
import AsyncStorage from "@react-native-async-storage/async-storage";

async function saveToken(token: string) {
  await AsyncStorage.setItem("auth_token", token);
}

async function loadToken(): Promise<string | null> {
  return AsyncStorage.getItem("auth_token");
}

// MMKV: synchrone Zugriffe ohne Promise
import { MMKV } from "react-native-mmkv";

const storage = new MMKV();

function saveTokenSync(token: string) {
  storage.set("auth_token", token);
}

function loadTokenSync(): string | undefined {
  return storage.getString("auth_token");
}

5. Migration bestehender AsyncStorage-Daten zu MMKV

Eine Migration lässt sich in der Praxis meist als einmaliger Schritt beim App-Start umsetzen: Alle vorhandenen Keys werden über AsyncStorage.getAllKeys() ermittelt, die zugehörigen Werte per multiGet gelesen und anschließend synchron in eine neue MMKV-Instanz geschrieben. Nach erfolgreicher Migration markiert eine eigene Flag-Property, dass der Vorgang abgeschlossen ist, damit er bei künftigen App-Starts nicht wiederholt wird.

Wichtig ist, die Migration idempotent zu gestalten und Fehlerfälle wie einen fehlgeschlagenen Einzelwert nicht die gesamte Migration abbrechen zu lassen, da sonst Nutzer mit teilweise migrierten, teilweise noch in AsyncStorage liegenden Daten enden könnten. Ein bewährtes Muster ist, AsyncStorage nach der Migration nicht sofort zu löschen, sondern erst nach einigen erfolgreichen App-Starts, um im Fehlerfall einen Rückweg zu behalten.

6. Verschlüsselungsoption von MMKV

MMKV unterstützt eine eingebaute Verschlüsselung, die beim Erzeugen einer Instanz über einen Encryption-Key aktiviert wird und alle Daten transparent mit AES verschlüsselt, bevor sie in die zugrunde liegende Datei geschrieben werden. Für sensible Daten wie Session-Tokens oder persönliche Nutzerinformationen ist das ein spürbarer Vorteil gegenüber AsyncStorage, das standardmäßig keinerlei Verschlüsselung mitbringt und dafür auf zusätzliche Bibliotheken angewiesen ist.

Der Encryption-Key selbst sollte nicht im Klartext im Code stehen, sondern über einen sicheren Secure-Storage-Mechanismus wie das iOS Keychain oder den Android Keystore verwaltet werden, damit die Verschlüsselung nicht durch einen leicht auslesbaren, hartkodierten Schlüssel ausgehebelt wird. MMKV selbst kümmert sich nicht um die Verwaltung dieses Schlüssels, das bleibt Aufgabe der App.

7. Multi-Instance- und Multi-Process-Unterstützung

Anders als eine einzelne globale AsyncStorage-Instanz erlaubt MMKV mehrere unabhängige, benannte Instanzen innerhalb derselben App, was sich gut eignet, um unterschiedliche Datenkategorien wie Nutzerpräferenzen, Cache-Daten und Auth-Informationen sauber voneinander zu trennen, ohne Namenskollisionen bei Keys befürchten zu müssen. Jede Instanz kann dabei ihre eigene Verschlüsselungskonfiguration erhalten.

MMKV unterstützt außerdem Multi-Process-Zugriff, was relevant wird, sobald eine App Erweiterungen wie einen iOS Share Extension oder einen Android Widget-Prozess besitzt, die auf dieselben Daten zugreifen müssen wie der Hauptprozess. AsyncStorage bietet dafür keinen eingebauten Mechanismus und würde eine eigene Interprozesskommunikation erfordern.

8. Grenzen von MMKV: große Datenmengen und komplexe Queries

MMKV ist als reiner Key-Value-Speicher konzipiert und bietet keine Möglichkeit für strukturierte Abfragen wie Filtern, Sortieren oder Verknüpfen mehrerer Datensätze, wie es eine relationale Datenbank leisten würde. Für Anwendungsfälle wie eine durchsuchbare Liste von tausenden Datensätzen mit komplexen Filterkriterien ist MMKV deshalb die falsche Wahl, hier eignet sich eher SQLite oder eine spezialisierte Lösung wie WatermelonDB.

Auch bei sehr großen Einzelwerten, etwa dem Zwischenspeichern kompletter API-Antworten mit mehreren Megabyte, verliert MMKV einen Teil seines Geschwindigkeitsvorteils, da der mmap-basierte Ansatz vor allem bei vielen kleinen, häufigen Zugriffen glänzt. MMKV bleibt in seinem Kern ein Ersatz für AsyncStorage, keine vollwertige Datenbank für komplexe, relationale Anforderungen.

9. Einbindung im Projekt: Installation und New-Architecture-Kompatibilität

Die Installation von react-native-mmkv erfolgt über den üblichen Paketmanager, gefolgt von einem nativen Build-Schritt, da MMKV auf nativem C++ Code basiert und nicht rein in JavaScript ausgeliefert wird. Auf iOS ist ein pod install nötig, auf Android greift Autolinking automatisch, sofern die Projektkonfiguration aktuell ist.

Aktuelle Versionen von react-native-mmkv sind explizit für die New Architecture mit JSI gebaut und funktionieren nicht im reinen Legacy-Modus ohne aktivierte New Architecture, da die synchrone API direkt auf JSI HostObjects aufsetzt. Projekte, die noch komplett auf der alten Architektur laufen, müssen entweder auf eine ältere MMKV-Version zurückgreifen oder zuerst auf die New Architecture umstellen, bevor sie MMKV einsetzen können.

Kriterium AsyncStorage MMKV Praktische Bedeutung
Zugriffsart Asynchron, Promise-basiert Synchron, direkter Rückgabewert MMKV eignet sich für Lesezugriffe während des Renderns
Geschwindigkeit bei kleinen Werten Vergleichsweise langsam Etwa 10 bis 30 mal schneller Deutlich spürbar bei häufigen Zugriffen
Verschlüsselung Nicht eingebaut, braucht Zusatzbibliothek Eingebaute AES-Verschlüsselung je Instanz MMKV spart eine zusätzliche Abhängigkeit
Mehrfachinstanzen Eine globale Instanz Mehrere benannte, unabhängige Instanzen Saubere Trennung von Datenkategorien mit MMKV
Eignung für große Datenmengen Begrenzt, für kleine Werte gedacht Ebenfalls begrenzt, kein Ersatz für SQLite Für komplexe Queries sind beide ungeeignet

Mironsoft

React-Native-App-Entwicklung und Magento-Anbindung

Eine mobile App zum Magento-Shop, die wirklich rund läuft?

Wir entwickeln React-Native-Apps, die sauber an die Magento REST- oder GraphQL-API angebunden sind, von der ersten Codezeile bis zur Veröffentlichung im App Store und bei Google Play.

App-Konzeption

Architektur und Feature-Umfang einer Magento-angebundenen App gemeinsam planen.

Magento-API-Integration

Produktkatalog, Warenkorb und Checkout sauber an die Shop-API anbinden.

Store-Veröffentlichung

App Store- und Google-Play-Freigabeprozess ohne Stolperfallen begleiten.

10. Zusammenfassung

MMKV vs. AsyncStorage: Das Wichtigste auf einen Blick

AsyncStorage

Asynchroner Key-Value-Speicher über TurboModule, solide für seltene Zugriffe, aber Overhead bei Häufigkeit.

MMKV

Synchroner, C++ und mmap-basierter Speicher über JSI, deutlich schneller bei vielen kleinen Zugriffen.

Migration

AsyncStorage-Daten lassen sich einmalig beim App-Start auslesen und in eine neue MMKV-Instanz überführen.

Grenzen

MMKV bleibt ein Key-Value-Speicher ohne Query-Fähigkeiten, für komplexe Datenmodelle bleibt SQLite die richtige Wahl.

11. FAQ: MMKV vs. AsyncStorage: Das Wichtigste auf einen Blick

1Ist MMKV grundsätzlich schneller als AsyncStorage?
Bei kleinen, häufigen Zugriffen ja, oft um das Zehn- bis Dreißigfache. Bei seltenen, sehr großen Werten relativiert sich der Unterschied etwas.
2Kann ich MMKV synchron während des Renderns lesen?
Ja, das ist einer der Hauptvorteile: MMKV-Methoden geben Werte direkt zurück, ohne Promise, wodurch sie sich auch außerhalb von useEffect sicher verwenden lassen.
3Funktioniert MMKV ohne die New Architecture?
Aktuelle Versionen sind explizit für JSI und die New Architecture gebaut. Ohne aktivierte New Architecture muss auf eine ältere MMKV-Version zurückgegriffen werden.
4Wie migriere ich bestehende AsyncStorage-Daten zu MMKV?
Über einen einmaligen Migrationsschritt beim App-Start, der alle Keys und Werte aus AsyncStorage ausliest und synchron in eine neue MMKV-Instanz schreibt, abgesichert über eine Fertig-Markierung.
5Bietet MMKV eingebaute Verschlüsselung?
Ja, über einen beim Erstellen der Instanz übergebenen Encryption-Key, der alle Daten transparent mit AES verschlüsselt, bevor sie gespeichert werden.
6Wo sollte der MMKV-Encryption-Key gespeichert werden?
Nicht hartkodiert im Code, sondern über einen sicheren Mechanismus wie das iOS Keychain oder den Android Keystore, damit der Schlüssel nicht leicht auslesbar ist.
7Eignet sich MMKV für eine große, durchsuchbare Datenliste?
Nein, MMKV ist ein reiner Key-Value-Speicher ohne Query-Fähigkeiten. Für strukturierte, filterbare Datenmengen ist SQLite oder eine spezialisierte Lösung wie WatermelonDB die bessere Wahl.
8Kann ich mehrere getrennte MMKV-Instanzen in einer App verwenden?
Ja, MMKV unterstützt mehrere unabhängige, benannte Instanzen, was sich gut eignet, um verschiedene Datenkategorien sauber voneinander zu trennen.
9Unterstützt MMKV den Zugriff aus App-Erweiterungen wie Widgets?
Ja, über Multi-Process-Unterstützung, was AsyncStorage ohne eigene Interprozesskommunikation nicht bietet.
10Sollte ich AsyncStorage komplett durch MMKV ersetzen?
Für die meisten Key-Value-Anwendungsfälle lohnt sich der Wechsel, insbesondere bei häufigen Zugriffen. Für seltene, unkritische Einzelzugriffe bleibt der Unterschied in der Praxis oft vernachlässigbar.