base de datos incrustable de 500 filas de pudge en golang

pudge es una base de datos clave / valor incrustable escrita en la biblioteca estándar Go.

imagen

Me detendré en las diferencias fundamentales de las soluciones existentes.

Apátrida

pudge.Set("../test/test", "Hello", "World") 

Puj creará automáticamente la base de datos de prueba, incluidos los subdirectorios, o la abrirá. No es necesario almacenar el estado de la tabla y puede almacenar valores de forma segura en aplicaciones de subprocesos múltiples. Pooj es seguro para subprocesos.

Tipo libre

En puj, puede escribir bytes, cadenas, números o estructuras. Sin preocuparse por convertir datos a su representación binaria.

  type Point struct { X int Y int } for i := 100; i >= 0; i-- { p := &Point{X: i, Y: i} db.Set(i, p) } var point Point db.Get(8, &point) log.Println(point) 

Sistema de consulta

Puj ofrece la capacidad de extraer claves en un orden específico, incluida la selección con un límite, sangría, clasificación y selección por prefijo.

  keys, _ := db.Keys(7, 2, 0, true) 

El código anterior es similar a la consulta SQL:

 select keys from db where key>7 order by keys asc limit 2 offset 0 

Tenga en cuenta que la clasificación de las teclas es "perezosa". Por otro lado, las claves se almacenan en la memoria y funciona bastante rápido.

Paralelismo

Pooj, como la mayoría de las bases de datos modernas, utiliza un modelo de lectura sin bloqueo, pero escribir en un archivo bloquea todas las operaciones. Pero puede crear / abrir archivos sobre la marcha, minimizando el número de bloqueos. No hay un error de "base de datos ya abierta" en puja. Ejemplo de uso en el enrutador http:

 func write(c *gin.Context) { var err error group := c.Param("group") counter := c.Param("counter") db, err := pudge.Open(group, cfg) if err != nil { renderError(c, err) return } _, err = db.Counter(counter, 1) if err != nil { renderError(c, err) return } c.String(http.StatusOK, "%s", "ok") } 

Motores

A pesar de su pequeño tamaño, el puj admite dos modos de almacenamiento de datos. En memoria y en disco. Por defecto, puj solo almacena datos (valores) en el disco. Pero si lo desea, puede habilitar el modo de almacenamiento de datos en la memoria. En este caso, se descargarán en el disco cuando se solicite o cuando la base de datos esté cerrada.

Estado

Pooj se usa tanto en proyectos domésticos como en producción, en el gráfico a continuación: el número de solicitudes al servidor http basado en puj y el número de solicitudes es superior a 20 ms



En este caso, la puja se enciende en modo de sincronización completa y, en el momento de fsync, se producen retrasos significativos (más de 20 ms). Pero afortunadamente, no hay tantos en términos porcentuales.

En la página del proyecto puede encontrar más enlaces con ejemplos de integración de puja en varios proyectos.

Velocidad

En el repositorio con benchmark'y puedes comparar puj con otras bases de datos:

Prueba 1


 Number of keys: 1000000 Minimum key size: 16, maximum key size: 64 Minimum value size: 128, maximum value size: 512 Concurrency: 2 
pogreb
goleveldb
perno
badgerdb
charco
slowpoke
charco (mem)
1M (Put + Get), segundos
187
38
126
34
23
23
2
1M puesto, operaciones / seg.
5336
34743
8054
33539
47298
46789
439581
1M Obtener, operaciones / seg.
1782423
98406
499871
220597
499172
445783
1652069
FileSize Mb
568
357
552
487
358
358
358

Pooja está muy bien equilibrado en la relación entre la velocidad de escritura y la velocidad de lectura. Que no es una base de datos altamente especializada optimizada para leer o escribir. A alta velocidad de lectura, se mantiene una velocidad de escritura bastante alta. Sin embargo, esto se puede aumentar al paralelizar grabaciones a diferentes archivos (como se hace en los motores LSM Tree).

Enlaces a las bases de datos utilizadas en la prueba:

  • pogreb Almacén de valores clave incrustado para cargas de trabajo de lectura pesada escritas en Go
  • Base de datos clave / valor goleveldb LevelDB en Go.
  • bolt Una base de datos de clave / valor incrustada para Go.
  • badgerdb DB clave-valor rápido en Go
  • slowpoke Almacén de clave / valor de bajo nivel en Go puro (basado en pudge)
  • pudge Almacén de clave / valor rápido y simple escrito usando la biblioteca estándar de Go

Me pidieron que comparara con memcache y redis, pero dado que la mayor parte del tiempo se dedica a las interfaces de red al interactuar con los datos de la base de datos, esto no es del todo justo. Aunque, por otro lado, la puja gana debido al subproceso múltiple, a pesar de que escribe datos en el disco.

Mayor desarrollo

  • Transacciones Sería conveniente combinar las solicitudes de escritura en el grupo, con la reversión automática en caso de error.
  • Capacidad para limitar la vida útil de la clave (como TTL en memcache / cassandra, etc.)
  • La falta de un servidor. Es conveniente incrustar la puja en microservicios existentes, pero lo más probable es que aparezca un servidor separado. Como parte de un proyecto separado.
  • Versión móvil Para usar en Android, iOS y como complemento para Flutter.

Source: https://habr.com/ru/post/439216/


All Articles