tienda flash
tienda flash
FlashStore es un almacenamiento persistente de valores clave con una API tipo mapa ES6 fácil de usar (compatible con Async y Sync), con tecnología de LevelDB y TypeScript.
Requisitos
- Node.js v10 o superior
Ejemplos
Prueba el siguiente comando
npm install
npm run demo
La función básica de la siguiente manera:
import { FlashStore } from 'flash-store'
const flashStore = new FlashStore('flashstore.workdir')
await flashStore.set(1, 'a')
console.log(`key: 1, value: ${await flashStore.get(1)}`)
// Output: 'a'
await flashStore.del(1)
console.log(`key: 1, value: ${await flashStore.get(1)}`)
// Output: undefined
Back-end compatible
back-end | Tienda flash | Instalar comando NPM |
---|---|---|
NivelDB | v1.0 | npm install [email protected] |
SQLite | v0.20 | npm install [email protected] |
medea | v0.18 | |
SnapDB | v0.16 | |
RocasDB | v0.14 | npm install [email protected] |
NivelDB | v0.12 | npm install [email protected] |
SnapDB y Medea quedaron en desuso debido a muchos errores desconocidos.
Referencia de la API
FlashStore
FlashStore implementa la API de mapas de ES6 estándar con la modificación Async, impulsada por async-map-like
/**
* ES6 Map API with Async
*/
export interface AsyncMap<K = any, V = any> {
[Symbol.asyncIterator]() : AsyncIterableIterator<[K, V]>
size : Promise<number>
clear () : Promise<void>
delete (key: K) : Promise<void>
entries() : AsyncIterableIterator<[K, V]>
get (key: K) : Promise<V | undefined>
has (key: K) : Promise<boolean>
keys () : AsyncIterableIterator<K>
set (key: K, value: V) : Promise<void>
values () : AsyncIterableIterator<V>
}
class FlashStore<K, V> implements AsyncMap<K, V> {}
FlashStoreSync
FlashStoreSync implementa la API de mapa estándar de ES6:
class FlashStoreSync<K, V> implements Map<K, V> {}
- Obtiene una API de sincronización a costa de que todos sus datos se mantengan en la memoria.
- Los datos se volverán a escribir de forma asíncrona en el disco para un almacenamiento persistente en segundo plano.
- El rendimiento de
FlashStoreSync
se puede esperar alto porque todo está en la memoria.
Documento
Ver documentos generados automáticamente
- ECMAScript 6: Mapas – 2ality – JavaScript y más
Ver también
- Bases de datos Node.js: una base de datos integrada que utiliza LevelDB
- Cómo cocinar una base de datos de gráficos en una noche – LevelGraph
- Estilo JS de base de datos de gráficos para Node.js y el navegador. Basado en LevelUp y LevelDB.
- 浅析 BigTable 和 LevelDB 的实现
Problemas conocidos
- los
gte
ylte
enoptions
no trabaje la propiedad. (#4)
Historial de versiones
maestro v1.3 (12 de septiembre de 2021)
- Compatibilidad con módulos ES (#93)
- Eliminar predeterminado
workdir
enFlashStore
constructor.
v1.0 (16 de agosto de 2021) LevelDB v7.0
Compatibilidad con LevelDB v7.0.0.
v0.20 Abr 2020 SQLite como Backend
- Codificamos el tipo de clave para que sea
string
solo en esta versión. - Decidimos probar better-sqlite3 ya que afirma que es muy rápido.
- Los otros suplentes (me encantaría intentarlo en el futuro si es necesario):
- Mecanografiado: sqlite
- Ensamblaje web: sql.js
v0.18 de febrero de 2019 – Medea como backend
DESAPROBADO: debido a #79 #74 y también es muy inestable en producción según mis experiencias. (por ejemplo, pérdida de memoria y bucle de eventos de bloqueo)
- Cambiar de SnapDB a MedeaDown
Medea es una biblioteca de almacenamiento persistente de clave-valor que se ejecuta en todos los lugares donde se ejecuta Node.
“Es una implementación JS pura de leveldown y es casi igual de rápida”. — Enlace de @Raynos
“El envoltorio compatible con LevelDOWN para Medea realmente abre la posibilidad de reutilizar los módulos que ya se han creado en torno al ecosistema LevelUP”. — @kevinswiber enlace
Problemas conocidos: FlashStore 会写满磁盘的问题 #155
async function compact (store: FlashStore): Promise<void> {
await store.size
const db = (store as any).levelDb.db.db.db
await new Promise((resolve, reject) => {
db.compact((err: any) => {
if (err) {
return reject(err)
}
resolve()
})
})
}
v0.16 de mayo de 2019 – SnapDB como backend
- Cambiar de RocksDB a SnapDB #45
- #50 ha sido arreglado.
ADVERTENCIA: no use esta versión porque tiene problemas conocidos
v0.14 de mayo de 2019 – RocksDB como backend
- Cambiar de LevelDB a RocksDB #34
v0.12 de enero de 2019: LevelDB como backend
- Use LevelDB como backend para omitir la compilación al instalar.
- Usando los tipos oficiales de leveldb de
@types/
v0.7 Ago 2018 – Nosql-LevelDB como Backend
- Utilice nosql-leveldb como backend para evitar errores de segmento.
v0.6 julio de 2018
- Actualizar a TypeScript 3.0
v0.4 junio 2018
1. API de refactorización para implementar ES6 Map
interfaz
- Actualice la API a ES6
Map
-como, la diferencia es que FlashStore es todo asíncrono.
2. Agregar FlashStoreSync
como en memoria Caché de reescritura para Flash-Store
Agregar una nueva clase FlashStoreSync
que es una carga completa en memoria Caché de reescritura para Flash-Store:
- escribe directamente a
cache
perezoso escribe astore
. - Lee desde la memoria caché, nunca se pierde porque la memoria caché tiene los datos completos de la tienda que nunca caducarán.
- API de
FlashStoreSync
es lo mismo que el ES6Map
v0.2 de septiembre de 2017
Versión de inicio, la API es similar a LevelDB.
Preguntas más frecuentes
P: ¿Cuál es la diferencia entre el flash-store
y memory-card
Respuesta corta:
flash-store
es para guardar datos en el sistema de archivos local.memory-card
es para guardar datos en un almacenamiento de red distribuido, se puede serializar/deserializar de forma segura con la carga útil mínima transferida por diseño.
Respuesta larga:
flash-store
y memory-card
todos están construidos por @huan, y todos siguen la API de mapas ES6.
flash-store
está utilizando una base de datos de archivos locales sin SQL para maximizar el rendimiento, se puede usar como una base de datos local o un caché local para lo que quiera almacenar en caché desde otra API.
memory-card
utiliza un archivo local para almacenar datos en formato JSON de forma predeterminada; sin embargo, admite métodos más distribuidos y puede serializarse/deserializarse de forma segura con la carga útil mínima para transferir los datos entre redes (por ejemplo, puede serializarse solo para incluir la redis
config y luego deserializarlo para restaurar una instancia de MemoryCard con el mismo backend de datos). Aprende más de su repositorio aquí
Autor
Huan LI (李卓桓) [email protected]
Derechos de autor y licencia
- Código y documentos © 2017-ahora Huan (李卓桓)
- Código publicado bajo la licencia Apache-2.0
- Documentos publicados bajo Creative Commons
Idiomas
-
Mecanografiado
57,4% -
JavaScript
35,8% -
Caparazón
6,8%