1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/FishGoddess-cachego

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.en.md 9.5 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 04:24 c0bccfe

Cachego — это дружественный к API кэш на основе памяти для приложений GoLang.

Он использовался многими сервисами в производстве, все сервисы работают стабильно, а самый высокий qps в сервисах составляет 96w/s, так что просто используйте его, если хотите! 👏🏻

Особенности:

  • Кэш в виде записей с минималистичным дизайном API.
  • Использование режима функций опций для настройки создания кэша.
  • Поддержка TTL и максимального размера записей в кэше.
  • Поддержка LRU и LFU.
  • Использование механизма блокировки сегментирования для обеспечения высокой производительности при параллельной работе.
  • Отложенная очистка, которая происходит после истечения срока действия записи.
  • Очистка по часовому механизму, очистка через фиксированные промежутки времени.
  • Поддержка Singleflight, которая может уменьшить количество случаев проникновения в кэш.
  • Поддержка задач таймера, что удобно для загрузки данных в кэш.
  • Поддержка отчётов, предоставляющая несколько точек отчётности.

Проверьте HISTORY.md и FUTURE.md для получения дополнительной информации.

Установка:

$ go get -u github.com/FishGoddess/cachego

Примеры:

package main

import (
    "fmt"
    "time"

    "github.com/FishGoddess/cachego"
)

func main() {
    // Используйте функцию NewCache для создания кэша.
    // По умолчанию она создаёт стандартный кэш, который удаляет записи случайным образом.
    // Используйте WithShardings для сегментирования кэша на несколько частей для повышения производительности.
    // Используйте WithGC для очистки просроченных записей каждые 10 минут.
    cache := cachego.NewCache(cachego.WithGC(10*time.Minute), cachego.WithShardings(64))

    // Установите запись в кэш с ttl.
    cache.Set("key", 123, time.Second)

    // Получите запись из кэша.
    value, ok := cache.Get("key")
    fmt.Println(value, ok) // 123 true

    // Проверьте, сколько записей хранится в кэше.
    size := cache.Size()
    fmt.Println(size) // 1

    // Очистите просроченные записи.
    cleans := cache.GC()
    fmt.Println(cleans) // 1

    // Установите запись, у которой нет ttl.
    cache.Set("key", 123, cachego.NoTTL)

    // Удалите запись.
    removedValue := cache.Remove("key")
    fmt.Println(removedValue) // 123

    // Сброс сбрасывает кэш до начального состояния.
    cache.Reset()

    // Получить значение из кэша и загрузить его в кэш, если не найдено.
    value, ok = cache.Get("key")
    if !ok {
        // Загруженная запись будет установлена в кэш и возвращена.
        // По умолчанию используется singleflight.
        value, _ = cache.Load("key", time.Second, func() (value interface{}, err error) {
            return 666, nil
        })
    }

    fmt.Println(value) // 666

    // Вы можете использовать WithLRU для указания типа кэша для lru.
    // Также попробуйте WithLFU, если вы хотите использовать lfu для удаления данных.
    cache = cachego.NewCache(cachego.WithLRU(100))
    cache = cachego.NewCache(cachego.WithLFU(100))

    // Используйте NewCacheWithReport для создания кэша с отчётом.
    cache, reporter := cachego.NewCacheWithReport(cachego.WithCacheName("test"))
    fmt.Println(reporter.CacheName())
    fmt.Println(reporter.CacheType())
}

_Дополнительные примеры можно найти в examples.

Бенчмарки:

goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz

BenchmarkCachegoGet-12                  25214618               47.2 ns/op             0 B/op          0 allocs/op
BenchmarkCachegoGetLRU-12                8169417              149.0 ns/op             0 B/op          0 allocs/op
BenchmarkCachegoGetLFU-12                7071300              171.6 ns/op             0 B/op          0 allocs/op
BenchmarkCachegoGetSharding-12          72568048               16.8 ns/op             0 B/op          0 allocs/op
BenchmarkGcacheGet-12                    4765129              252.1 ns/op            16 B/op          1 allocs/op
BenchmarkGcacheGetLRU-12                 5735739
``` 214,0 нс/оп             16 Б/оп          1 аллокс/оп
БенчмаркГкэшГетЛФУ-12                  4 830 048              250,8 нс/оп            16 Б/оп          1 аллокс/оп
БенчмаркЭкэшГет-12                     11 515 140              101,0 нс/оп             0 Б/оп          0 аллокс/оп
БенчмаркЭкэш2Гет-12                    12 255 506               95,6 нс/оп             0 Б/оп          0 аллокс/оп
БенчмаркБигкэшГет-12                   21 711 988               60,4 нс/оп             7 Б/оп          2 аллокс/оп
БенчмаркФризонкэшГет-12                24 903 388               44,3 нс/оп            27 Б/оп          2 аллокс/оп
БенчмаркГоКэшГет-12                    19 818 014               61,4 нс/оп             0 Б/оп          0 аллокс/оп

БенчмаркКэшгоСэт-12                      5 743 768               209,6 нс/оп           16 Б/оп          1 аллокс/оп
БенчмаркКэшгоСЭТЛРУ-12                  6 105 316               189,9 нс/оп           16 Б/оп          1 аллокс/оп
БенчмаркКэшгоСЭтлфу-12                  5 505 601               217,2 нс/оп           16 Б/оп          1 аллокс/оп
БенчмаркКэшгоСЭтШэрдИн-12              39 012 607                31,2 нс/оп           16 Б/оп          1 аллокс/оп
БенчмаркГкэшСэт-12                       3 326 841               365,3 нс/оп           56 Б/оп          3 аллокс/оп
БенчмаркГкэшСЭТЛру-12                   3 471 307               318,7 нс/оп           56 Б/оп          3 аллокс/оп
БенчмаркГкэшСЭтлфу-12                   3 896 512               335,1 нс/оп           56 Б/оп          3 аллокс/оп
БенчмаркЭкэшСэт-12                       7 318 136               167,5 нс/оп           32 Б/оп          2 аллокс/оп
БенчмаркЭкэш2Сэт-12                     7 020 867               175,7 нс/о            32 Б/оп          2 аллокс/оп
БенчмаркБигкэшСэт-12                    4 107 825               268,9 нс/оп           55 Б/оп          0 аллокс/оп
БенчмаркФризонкэшСэт-12               44 181 687                28,4 нс/оп            0 Б/оп          0 аллокс/оп
БенчмаркГокэшСэт-12                     4 921 483               249,0 нс/оп           16 Б/оп          1 аллокс/оп
> Обратите внимание: Экэш имеет только режим LRU, включая версии v1 и v2; Фризонкэш имеет 256 шардингов, и мы не можем сбросить до 1.

> Бенчмарки: [_examples/performance_test.go](./_examples/performance_test.go)

Как вы можете видеть, кэшго имеет более высокую производительность с шардингом, но шардинг имеет дополнительную операцию позиционирования, поэтому если стоимость блокировки меньше стоимости позиционирования, этот шардинг замедляет работу. Однако в большинстве случаев он показывает лучшую производительность.

### 👥 Вкладчики

* [cristiane](https://gitee.com/cristiane): оптимизация хэша
* [hzy15610046011](https://gitee.com/hzy15610046011): дизайн архитектуры и рисунки
* [chen661](https://gitee.com/chen661): ограничение аргумента в опции WithSegmentSize

Пожалуйста, откройте **проблему**, если вы обнаружите, что что-то работает не так, как ожидалось.

[![Star History Chart](https://api.star-history.com/svg?repos=fishgoddess/cachego&type=Date)](https://star-history.com/#fishgoddess/cachego&Date)

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/FishGoddess-cachego.git
git@api.gitlife.ru:oschina-mirror/FishGoddess-cachego.git
oschina-mirror
FishGoddess-cachego
FishGoddess-cachego
master