Быстрый, одновременный, выселяющий кэш в памяти, записанный, чтобы держать большое количество записей без влияния на производительность. BigCache держит записи на куче, но опускает GC для них. Чтобы достичь этого, операции на срезах байтов происходят, поэтому в большинстве случаев использования будет необходима сериализация (DE) перед кешем.
Требуется GO 1.12 или новее.
import (
"fmt"
"context"
"github.com/allegro/bigcache/v3"
)
cache , _ := bigcache . New ( context . Background (), bigcache . DefaultConfig ( 10 * time . Minute ))
cache . Set ( "my-unique-key" , [] byte ( "value" ))
entry , _ := cache . Get ( "my-unique-key" )
fmt . Println ( string ( entry ))Когда нагрузка на кэш может быть предсказана заранее, то лучше использовать пользовательскую инициализацию, поскольку таким образом можно избежать дополнительного распределения памяти.
import (
"log"
"github.com/allegro/bigcache/v3"
)
config := bigcache. Config {
// number of shards (must be a power of 2)
Shards : 1024 ,
// time after which entry can be evicted
LifeWindow : 10 * time . Minute ,
// Interval between removing expired entries (clean up).
// If set to <= 0 then no action is performed.
// Setting to < 1 second is counterproductive — bigcache has a one second resolution.
CleanWindow : 5 * time . Minute ,
// rps * lifeWindow, used only in initial memory allocation
MaxEntriesInWindow : 1000 * 10 * 60 ,
// max entry size in bytes, used only in initial memory allocation
MaxEntrySize : 500 ,
// prints information about additional memory allocation
Verbose : true ,
// cache will not allocate more memory than this limit, value in MB
// if value is reached then the oldest entries can be overridden for the new ones
// 0 value means no size limit
HardMaxCacheSize : 8192 ,
// callback fired when the oldest entry is removed because of its expiration time or no space left
// for the new entry, or because delete was called. A bitmask representing the reason will be returned.
// Default value is nil which means no callback and it prevents from unwrapping the oldest entry.
OnRemove : nil ,
// OnRemoveWithReason is a callback fired when the oldest entry is removed because of its expiration time or no space left
// for the new entry, or because delete was called. A constant representing the reason will be passed through.
// Default value is nil which means no callback and it prevents from unwrapping the oldest entry.
// Ignored if OnRemove is specified.
OnRemoveWithReason : nil ,
}
cache , initErr := bigcache . New ( context . Background (), config )
if initErr != nil {
log . Fatal ( initErr )
}
cache . Set ( "my-unique-key" , [] byte ( "value" ))
if entry , err := cache . Get ( "my-unique-key" ); err == nil {
fmt . Println ( string ( entry ))
}LifeWindow & CleanWindow LifeWindow - это время. После этого времени можно назвать мертвым, но не удаленным.
CleanWindow - это время. После этого время все мертвые записи будут удалены, но не записи, которые все еще имеют жизнь.
Были сравнены три кэша: бигкаш, фрикаш и карта. Контрольные тесты проводились с использованием процессора I7-6700K при 4,00 ГГц с 32 ГБ оперативной памяти на Ubuntu 18.04 LTS (5.2.12-050212-Generic).
Здесь можно найти исходный код исходного кода
go version
go version go1.13 linux/amd64
go test -bench=. -benchmem -benchtime=4s ./... -timeout 30m
goos: linux
goarch: amd64
pkg: github.com/allegro/bigcache/v3/caches_bench
BenchmarkMapSet-8 12999889 376 ns/op 199 B/op 3 allocs/op
BenchmarkConcurrentMapSet-8 4355726 1275 ns/op 337 B/op 8 allocs/op
BenchmarkFreeCacheSet-8 11068976 703 ns/op 328 B/op 2 allocs/op
BenchmarkBigCacheSet-8 10183717 478 ns/op 304 B/op 2 allocs/op
BenchmarkMapGet-8 16536015 324 ns/op 23 B/op 1 allocs/op
BenchmarkConcurrentMapGet-8 13165708 401 ns/op 24 B/op 2 allocs/op
BenchmarkFreeCacheGet-8 10137682 690 ns/op 136 B/op 2 allocs/op
BenchmarkBigCacheGet-8 11423854 450 ns/op 152 B/op 4 allocs/op
BenchmarkBigCacheSetParallel-8 34233472 148 ns/op 317 B/op 3 allocs/op
BenchmarkFreeCacheSetParallel-8 34222654 268 ns/op 350 B/op 3 allocs/op
BenchmarkConcurrentMapSetParallel-8 19635688 240 ns/op 200 B/op 6 allocs/op
BenchmarkBigCacheGetParallel-8 60547064 86.1 ns/op 152 B/op 4 allocs/op
BenchmarkFreeCacheGetParallel-8 50701280 147 ns/op 136 B/op 3 allocs/op
BenchmarkConcurrentMapGetParallel-8 27353288 175 ns/op 24 B/op 2 allocs/op
PASS
ok github.com/allegro/bigcache/v3/caches_bench 256.257sПишет и читает в бигкахе быстрее, чем в FreeCache. Пишет на карту самые медленные.
go version
go version go1.13 linux/amd64
go run caches_gc_overhead_comparison.go
Number of entries: 20000000
GC pause for bigcache: 1.506077ms
GC pause for freecache: 5.594416ms
GC pause for map: 9.347015ms go version
go version go1.13 linux/arm64
go run caches_gc_overhead_comparison.go
Number of entries: 20000000
GC pause for bigcache: 22.382827ms
GC pause for freecache: 41.264651ms
GC pause for map: 72.236853ms
Тест показывает, сколько времени длится паузы GC для кешей, заполненных 20 млн записей. BigCache и FreeCache имеют очень похожее время паузы GC.
Вы можете встретить системную память, сообщающую о том, что представляется экспоненциальным увеличением, однако это ожидаемое поведение. Перейдите на время выполнения выплаты памяти кусочками или «простираются» и сообщат ОС, когда им больше не требуется, изменяя свое состояние на «простаивание». «Пролечки» останутся частью использования ресурсов процесса до тех пор, пока ОС не потребует перепрофилирования адреса. Дополнительное чтение доступно здесь.
BigCache полагается на оптимизацию, представленную в 1,5 версии GO (выпуск-9477). Эта оптимизация утверждает, что если используется карта без указателей в ключах и значениях, то GC будет опустить его содержание. Поэтому BigCache использует map[uint64]uint32 где клавиши хешируются, а значения - это смещения записей.
Записи хранятся в байтовых ломтиках, чтобы снова опустить GC. Размер среза байтов может расти до гигабайт без влияния на производительность, потому что GC увидит только отдельный указатель.
BigCache не обрабатывает столкновения. Когда новый элемент вставлен, и он столкнулся с хэшем с ранее сохраненным предметом, новый элемент перезаписывает ранее сохраненное значение.
Оба кэша обеспечивают одинаковые основные особенности, но они по -разному снижают накладные расходы GC. BigCache полагается на map[uint64]uint32 , FreeCache реализует свое собственное отображение, основанное на срезах, чтобы уменьшить количество указателей.
Результаты эталонных тестов представлены выше. Одним из преимуществ BigCache над FreeCache является то, что вам не нужно заранее знать размер кэша, потому что, когда BigCache заполнен, он может выделить дополнительную память для новых записей вместо того, чтобы перезаписать существующие, как это делает FreeCache в настоящее время. Однако можно установить жесткий максимальный размер в BigCache, проверьте HardmaxCachesize.
Этот пакет также включает в себя легко развертываемую HTTP -реализацию BigCache, которую можно найти в пакете сервера.
BigCache Genesis описан в сообщении Allegro.Tech в блоге: написание очень быстрого кэша в Go
BigCache выпускается по лицензии Apache 2.0 (см. Лицензию)