pudge é um banco de dados de chave / valor incorporável escrito na biblioteca padrão Go.
Vou me debruçar sobre as diferenças fundamentais das soluções existentes.
Sem Estadopudge.Set("../test/test", "Hello", "World") 
O Puj criará automaticamente o banco de dados de teste, incluindo subdiretórios, ou o abrirá. Não há necessidade de armazenar o estado da tabela e você pode armazenar valores com segurança em aplicativos multithread. Pooj é thread-safe.
TypefreeNo puj, você pode escrever bytes, seqüências de caracteres, números ou estruturas. Sem se preocupar com a conversão de dados em sua representação binária.
  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 oferece a capacidade de extrair chaves em uma ordem específica, incluindo seleção com um limite, recuo, classificação e seleção por prefixo.
  keys, _ := db.Keys(7, 2, 0, true) 
O código acima é semelhante à consulta SQL:
 select keys from db where key>7 order by keys asc limit 2 offset 0 
Observe que a classificação das chaves é "preguiçosa". Por outro lado, as chaves são armazenadas na memória e são executadas rapidamente.
ParalelismoPooj, como a maioria dos bancos de dados modernos, usa um modelo de leitura sem bloqueio, mas a gravação em um arquivo bloqueia todas as operações. Mas você pode criar / abrir arquivos em tempo real, minimizando o número de bloqueios. Não há erro "banco de dados já aberto" no puja. Exemplo de uso no roteador 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") } 
MotoresApesar de seu tamanho pequeno, o puj suporta dois modos de armazenamento de dados. Na memória e no disco. Por padrão, o puj armazena apenas dados (valores) no disco. Mas, se desejar, você pode ativar o modo de armazenamento de dados na memória. Nesse caso, eles serão liberados para o disco mediante solicitação ou quando o banco de dados for fechado.
StatusPooja é usado tanto em projetos domésticos quanto em produção, no gráfico abaixo - o número de solicitações para o servidor http com base no puja e o número de solicitações é superior a 20 ms

Nesse caso, o puja é ativado no modo de sincronização completa e, no momento do fsync, ocorrem atrasos significativos (mais de 20 ms). Felizmente, porém, não existem tantos em termos percentuais.
Na página do 
projeto , você pode encontrar mais links com exemplos de integração do puja em vários projetos.
VelocidadeNo 
repositório com benchmark'y, você pode comparar o puj com outros bancos de dados:
Teste 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 
 | parafuso 
 | badgerdb 
 | pudge 
 | slowpoke 
 | pudge (mem) 
 | 
| 1 milhão (Put + Get), segundos 
 | 187 
 | 38. 
 | 126 
 | 34 
 | 23 
 | 23 
 | 2 
 | 
| 1M Put, ops / s 
 | 5336 
 | 34743 
 | 8054 
 | 33539 
 | 47298 
 | 46789 
 | 439581 
 | 
| 1M de obtenção, ops / s 
 | 1782423 
 | 98406 
 | 499871 
 | 220597 
 | 499172 
 | 445783 
 | 1652069 
 | 
| FileSize Mb 
 | 568 
 | 357 
 | 552 
 | 487 
 | 358 
 | 358 
 | 358 
 | 
Pooja é muito bem equilibrado na proporção entre velocidade de gravação e velocidade de leitura. Que não é um banco de dados altamente especializado, otimizado para leitura ou gravação. Em alta velocidade de leitura - é mantida uma velocidade de gravação bastante alta. O que, no entanto, pode ser aumentado ainda mais, paralelizando as gravações em arquivos diferentes (como é feito nos mecanismos da LSM Tree).
Links para os bancos de dados usados no teste:
- pogreb Armazenamento de valores-chave incorporado para cargas de trabalho pesadas de leitura, escritas em Go
- goleveldb Banco de dados de chave / valor LevelDB no Go.
- bolt Um banco de dados de chave / valor incorporado para o Go.
- DB rápido do valor-chave no Go
- slowpoke Armazenamento de chave / valor de baixo nível no Go puro (baseado em pudge)
- pudge Armazenamento rápido e simples de chave / valor escrito usando a biblioteca padrão da Go
Eles me pediram para comparar com memcache e redis, mas como a maior parte do tempo é gasta em interfaces de rede ao interagir com dados de banco de dados, isso não é totalmente justo. Embora, por outro lado, o puja vença devido ao multithreading, apesar de gravar dados no disco.
Desenvolvimento adicional- Transações Seria conveniente combinar solicitações de gravação para o pool, com reversão automática em caso de erro.
- Capacidade de limitar a vida útil da chave (como TTL no memcache / cassandra etc.)
- A falta de um servidor. É conveniente incorporar o puja nos microsserviços existentes, mas provavelmente um servidor separado aparecerá. Como parte de um projeto separado.
- Versão para celular. Para uso no Android, iOS e como um plugin para o Flutter.