"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Vaya a la caché de alto rendimiento con TTL y persistencia de disco

Vaya a la caché de alto rendimiento con TTL y persistencia de disco

Publicado el 2024-08-15
Navegar:977

Go High-Performance Cache with TTL and Disk Persistence

1.Introducción

Acelera tus proyectos de Golang sin la molestia de configurar una base de datos cada vez que comienzas un nuevo proyecto. ¿Estás cansado de configurar bases de datos desde cero? ¿Sólo para afrontar nuevos problemas? No busques más. En este blog analizaremos la biblioteca de almacenamiento en caché de Golang con soporte para TTL, persistencia del disco y tipo de datos hash.

GoSwift.

2.Requisito previo

  • Conocimientos básicos de Golang
  • Conocimiento de cómo funciona un caché típico

3.Características

  1. Establecer y obtener comando
  2. Comando de actualización
  3. Supr comando
  4. Existe comando
  5. Soporte para TTL
  6. Soporte para guardar disco (instantáneas)
  7. Soporta tipo de datos Hash (Hset, Hget, HgetAll, HMset)
  8. Bloqueo seguro

Establecer y obtener 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 actualización

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

Comando Supr && 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

Soporte 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)

Admite el tipo de datos 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áneas

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

Esto tomará una instantánea de los datos cada 5 segundos y la guardará en un archivo Snapshot.data. De forma predeterminada, las instantáneas están deshabilitadas y, si no se proporciona SnapshotInterval, el valor predeterminado es 5 segundos.

NOTA: Si EnableSnapshot es falso, los datos guardados en el archivo no se importarán

Manejo de errores

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

Estos son los errores comunes que pueden ocurrir al escribir el código. Estas variables le proporcionan un método de comparación de errores claro y sencillo para determinar errores.

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

Funcionamiento interno de la caducidad de la caché

Cada 3 segundos se llama a la función **sweaper ** para borrar los valores caducados de la tabla hash. Mantenemos un montón mínimo que apunta al mapa hash. El elemento superior será la clave con el TTL más pequeño. atravesamos el árbol hasta que TTL sea mayor que la hora actual.

Resumen

¡¡No te recomendaría que uses esto en producción!!, pero siéntete libre de usarlo en tu pequeño proyecto paralelo. Pruébelo y, si encuentra un error, cree un problema en el repositorio de GitHub.

Correo electrónico: [email protected]
Github: https://github.com/leoantony72
Repositorio: https://github.com/leoantony72/goswift

Declaración de liberación Este artículo se reproduce en: https://dev.to/leoantony72/go-high-performance-cache-with-ttl-and-disk-persistence-4a4m?1 Si hay alguna infracción, comuníquese con [email protected] para borrarlo
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3