candycache/README.md

7.0 KiB
Raw Blame History

🍬 Candy Cache 🍬

CandyCache — это простой и эффективный кэш на языке Go, который позволяет хранить данные с ограниченным временем жизни (TTL).

Установка

Для использования CandyCache в вашем проекте, установите его, используя go get git.hikan.ru/serr/candycache, далее просто добавьте git.hikan.ru/serr/candycache в блок импорта.

Основные возможности

  • Автоматическая очистка устаревших элементов и возможность ее отключения.
  • Кэшем можно управлять вручную.
  • Конкурентный доступ к данным возможен благодаря мьютексам.
  • Кэш может хранить данные любых типов.
  • Можно создавать и загружать дампы кэша.

Использование

Создание кэша

С автоматической очисткой

Для создания нового экземпляра кэша используйте функцию Cacher, передавая интервал очистки в наносекундах.

Если требуется указать интервал в секундах/минутах/часах и т.д. - используйте множители из пакета time:

cache := candycache.Cacher(10 * time.Minute) // Очистка каждые 10 минут

Без автоматической очистки

Если автоматичская очистка не нужна - просто передайте параметром любое отрицательное число:

cache := candycache.Cacher(-1) // Кэш не будет очищаться автоматически

Добавление элемента

Для добавления элемента в кэш используйте метод Set:

cache.Set("key", "value", 5 * time.Minute) // Элемент будет считаться устаревшим через 5 минут

В случае, если по указанном ключу уже что-то хранится, оно будет заменено на новый элемент.

Получение элемента

Для получения элемента из кэша используйте метод Get:

value, err := cache.Get("key") // Получение значения по ключу "key"

Если элемент найден, то в переменную value будет записано значение, а в err - nil. Если элемент не найден, то в err будет записано key not found, а значением вернется nil.

Удаление элемента

Для удаления элемента по ключу используйте метод Delete:

err := cache.Delete("key1")
if err != nil {
    fmt.Println("Ошибка:", err) // Не найдено записи по ключу
}

Элемент будет удален, не смотря на то, устаревший он или нет.

Массовое удаление элементов

Удаление устаревших элементов

Для удаления устаревших элементов используйте метод Cleanup:

cache.Cleanup() // Перебирает все элементы кэша, удаляет устаревшие

Удаление всех элементов кэша

Для полной очистки кэша используйте метод Flush:

cache.Flush() // Удаляет все элементы кэша, не смотря на то, устаревшие они или нет

Получение информации о кэше

Получение списка элементов

Для получения списка всех элементов в кэше используйте метод List:

items := cache.List() // Список всех элементов кэша
for _, item := range items {
    fmt.Printf("Ключ: %s, Значение: %v, Момент устаревания: %d\n", item.Key, item.Item.Data(), item.Item.DestroyTimestamp())
}

Получение количества элементов

Для получения количества элементов в кэше используйте метод Count:

count := cache.Count() // Количество элементов в кэше

Получение размера кэша

Для получения размера всего кэша в байтах используйте метод Size:

size := cache.Size() // Размер кэша в байтах

Данный метод возвращает корректное значение, если в кэше элементы представлены этими типами данных:

bool
int, int8, int16, int32, int64
uint, uint8, uint16, uint32, uint64, uintptr
float32, float64
complex64, complex128
array, slice, string
map, struct, func

И композициями этих типов.

В противном случае значение может быть не точным.

Пример использования

package main

import (
	"fmt"
	"log"
	"main/candycache"
	"os"
	"time"
)

type Person struct {
	Name    string
	Age     int
	Hobbies []string
}

func main() {
	cache := candycache.Cacher(10 * time.Minute) // Создаем кэш с интервалом очистки 10 минут

	cache.Set("key1", "string", 5*time.Minute)
	cache.Set("key2", 2, 10*time.Minute)
	cache.Set("key7", -2.1231, 10*time.Minute)
	cache.Set("key3", []string{"string1", "string2"}, 10*time.Minute)
	cache.Set("key4", map[string]int{"a": 1, "b": 2}, 10*time.Minute)
	cache.Set("key5", Person{Name: "Alice", Age: 30, Hobbies: []string{"reading", "swimming"}}, 10*time.Minute)
	cache.Set("key6", []Person{
		{Name: "Bob", Age: 25, Hobbies: []string{"coding", "gaming"}},
		{Name: "Charlie", Age: 35, Hobbies: []string{"hiking", "photography"}},
	}, 10*time.Minute)

	file, err := os.Create("cache_dump.json")
	if err != nil {
		log.Fatal("error creating file: ", err)
	}

	if err := cache.Save(file); err != nil { // Сохранение кэша в файл
		log.Fatal("error saving cache: ", err)
	}
	file.Close()

	cache.Flush() // Удаление всех элементов из кэша

	file, err = os.Open("cache_dump.json")
	if err != nil {
		log.Fatal("error opening file: ", err)
	}

	if err := cache.Load(file); err != nil { // Загрузка кэша из файла
		fmt.Println("error load cache:", err)
	}

	list := cache.List() // Получаю список элементов кэша

	for _, i := range list {
		fmt.Println(i.Key, i.Item.Data(), i.Item.DestroyTimestamp())
	}
}