"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Obtenha cache de alto desempenho com TTL e persistência de disco

Obtenha cache de alto desempenho com TTL e persistência de disco

Publicado em 15/08/2024
Navegar:690

Go High-Performance Cache with TTL and Disk Persistence

1.Introdução

Acelere seus projetos Golang sem o incômodo de configurar um banco de dados sempre que iniciar um novo projeto. Cansado de configurar bancos de dados do zero? Apenas para enfrentar novos problemas? Não procure mais Neste blog, examinaremos a biblioteca de cache Golang com suporte para TTL, disk Persistence e Hash Data type.

GoSwift.

2.Pré-requisito

  • Conhecimento básico de Golang
  • Conhecimento de como funciona um cache típico

3.Recursos

  1. Definir e obter comando
  2. Comando de atualização
  3. Del comando
  4. Existe comando
  5. Suporte para TTL
  6. Suporte para salvamento em disco (instantâneos)
  7. Suporta tipo de dados hash (Hset, Hget, HgetAll, HMset)
  8. Bloqueio seguro

Definir e obter comando

import (
    "fmt"
    "github.com/leoantony72/goswift"
)

func main(){
    cache := goswift.NewCache()

    // Value 0 indicates no expiry
    cache.Set("key", "value", 0)

    val, err := cache.Get("key")
    if err !=nil{
        fmt.Println(err)
        return
    }
    fmt.Println("key", val)
}

Comando de atualização

// Update value
// @Update(key string, val interface{}) error
err = cache.Update("key","value2")
if err != nil{
    fmt.Println(err)
    return
}

Comando Del && Comando Existe

// Delete command
// @Del(key string)
cache.Del("key")

// Exist command
// @Exists(key string) bool
value = cache.Exists("key")
fmt.Println(value) // returns false

Suporte para TTL

// Set Value with Expiry
// @Set(key string, val interface{}, exp int)
// Here expiry is set to 1sec
cache.Set("key","value",1000)

// Hset command
// @Hset(key, field string, value interface{}, exp int)
// in this case the "key" expires in 1sec
cache.Hset("key","name","value",1000)
cache.Hset("key","age",18,1000)

Suporte ao tipo de dados Hash (Hset, Hget, HgetAll, HMset)

// Hset command
// @Hset(key, field string, value interface{}, exp int)
// in this case the "key" expires in 1sec
cache.Hset("key","name","value",1000)
cache.Hset("key","age",18,1000)


// HMset command
// @HMset(key string, d interface{}, exp int) error
// Set a Hash by passing a Struct/Map
// ---by passing a struct---
type Person struct{
    Name  string
    Age   int
    Place string
}

person1 := &Person{Name:"bob",Age:18,Place:"NYC"}
err = cache.HMset("key",person1)
if err != nil{
    fmt.Println(err)
    return
}

// ---by passing a map---
person2 := map[string]interface{Name:"john",Age:18,Place:"NYC"}
err = cache.HMset("key",person2)
if err != nil{
    fmt.Println(err)
    return
}


// Hget command
// @HGet(key, field string) (interface{}, error)
// get individual fields in Hash
data,err := cache.HGet("key","field")
if err != nil{
    fmt.Println(err)
    return
}
fmt.Println(data)

// HgetAll command
// @HGetAll(key string) (map[string]interface{}, error)
// gets all the fields with value in a hash key
// retuns a map[string]interface{}
data,err = cache.HGetAll("key")
if err != nil{
    fmt.Println(err)
    return
}

Instantâneos

opt := goswift.CacheOptions{
        EnableSnapshots:  true,
        SnapshotInterval: time.Second*5,
    }
c := goswift.NewCache(opt)

Isso tirará um instantâneo dos dados a cada 5 segundos e os salvará em um arquivo Snapshot.data. Por padrão, os instantâneos estão desabilitados e se o SnapshotInterval não for fornecido, o valor padrão é 5 segundos.

NOTA: Se EnableSnapshot for falso, os dados salvos no arquivo não serão importados

Tratamento de erros

const (
    ErrKeyNotFound   = "key does not Exists"
    ErrFieldNotFound = "field does not Exists"
    ErrNotHashvalue  = "not a Hash value/table"
    ErrHmsetDataType = "invalid data type, Expected Struct/Map"
)

Estes são os erros comuns que podem ocorrer ao escrever o código. Essas variáveis ​​fornecem um método de comparação de erros claro e fácil para determinar erros.

data,err := cache.Get("key")
if err != nil {
    if err.Error() == goswift.ErrKeyNotFound {
        //do something
}
}    

Funcionamento interno da expiração do cache

A cada 3 segundos, a função **sweeper **é chamada para limpar os valores expirados da tabela hash. Mantemos um heap mínimo que aponta para o mapa hash. O elemento superior será a chave com o menor TTL. percorremos a árvore até que o TTL seja maior que a hora atual.

Resumo

Eu não aconselharia você a usar isso na produção!!, mas sinta-se à vontade para usá-lo em seu pequeno projeto paralelo. Experimente e se você encontrar um bug, crie um problema no repositório GitHub.

E-mail: [email protected]
Github: https://github.com/leoantony72
Repositório: https://github.com/leoantony72/goswift

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/leoantony72/go-high-performance-cache-with-ttl-and-disk-persistence-4a4m?1 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3