pudge es una base de datos clave / valor incrustable escrita en la biblioteca estándar Go.
Me detendré en las diferencias fundamentales de las soluciones existentes.
Apátridapudge.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 libreEn 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 consultaPuj 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.
ParalelismoPooj, 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") }
MotoresA 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.
EstadoPooj 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.
VelocidadEn 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.