Cachego — это дружественный к API кэш на основе памяти для приложений GoLang.
Он использовался многими сервисами в производстве, все сервисы работают стабильно, а самый высокий qps в сервисах составляет 96w/s, так что просто используйте его, если хотите! 👏🏻
Проверьте 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
Пожалуйста, откройте **проблему**, если вы обнаружите, что что-то работает не так, как ожидалось.
[](https://star-history.com/#fishgoddess/cachego&Date)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )