«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Перейти к высокопроизводительному кэшу с TTL и постоянством диска

Перейти к высокопроизводительному кэшу с TTL и постоянством диска

Опубликовано 15 августа 2024 г.
Просматривать:211

Go High-Performance Cache with TTL and Disk Persistence

1.Введение

Ускорьте реализацию своих проектов на Golang без необходимости настраивать базу данных каждый раз, когда вы начинаете новый проект. Устали настраивать базы данных с нуля? Только чтобы столкнуться с новыми проблемами? Не ищите дальше. В этом блоге мы рассмотрим библиотеку кэширования Golang с поддержкой TTL, постоянства диска и типа хэш-данных.

GoSwift.

2.Предварительное условие

  • Базовые знания Golang
  • Знание того, как работает типичный кеш

3.Особенности

  1. Команда «Установить и получить»
  2. Команда обновления
  3. Команда «Удалить»
  4. Команда существует
  5. Поддержка TTL
  6. Поддержка сохранения на диск (снимки)
  7. Поддержка типов хэш-данных (Hset, Hget, HgetAll, HMset)
  8. Безопасная блокировка

Команда «Установить и получить»

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

Команда обновления

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

Команда Del && Команда существует

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

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

Поддержка 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)

Поддержка типов хэш-данных (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
}

Снимки

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

При этом каждые 5 секунд будет делаться снимок данных и сохраняться в файл Snapshot.data. По умолчанию снимки отключены, и если SnapshotInterval не указан, значение по умолчанию составляет 5 секунд.

ПРИМЕЧАНИЕ: Если EnableSnapshot имеет значение false, данные, сохраненные в файле, не будут импортированы

Обработка ошибок

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

Это распространенные ошибки, которые могут возникнуть при написании кода. Эти переменные предоставляют вам понятный и простой метод сравнения ошибок для определения ошибок.

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

Внутренняя работа по истечении срока действия кэша

Каждые 3 секунды вызывается функция **sweaper ** для очистки просроченных значений из хеш-таблицы. Мы поддерживаем минимальную кучу, которая указывает на хеш-карту. Верхним элементом будет ключ с наименьшим TTL. мы проходим по дереву до тех пор, пока TTL не станет больше текущего времени.

Краткое содержание

Я бы не советовал вам использовать это в производстве!!, но не стесняйтесь использовать его в своем небольшом побочном проекте. Попробуйте, и если вы обнаружите ошибку, сообщите о ней в репозитории GitHub.

Электронная почта: [email protected]
Гитхаб: https://github.com/leoantony72
Репо: https://github.com/leoantony72/goswift

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/leoantony72/go-high- Performance-cache-with-ttl-and-disk-persistence-4a4m?1. Если есть какие-либо нарушения, пожалуйста, свяжитесь с [email protected] удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3