forked from cerc-io/plugeth
87 lines
3.4 KiB
Go
87 lines
3.4 KiB
Go
|
package bigcache
|
||
|
|
||
|
import "time"
|
||
|
|
||
|
// Config for BigCache
|
||
|
type Config struct {
|
||
|
// Number of cache shards, value must be a power of two
|
||
|
Shards int
|
||
|
// Time after which entry can be evicted
|
||
|
LifeWindow time.Duration
|
||
|
// 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 time.Duration
|
||
|
// Max number of entries in life window. Used only to calculate initial size for cache shards.
|
||
|
// When proper value is set then additional memory allocation does not occur.
|
||
|
MaxEntriesInWindow int
|
||
|
// Max size of entry in bytes. Used only to calculate initial size for cache shards.
|
||
|
MaxEntrySize int
|
||
|
// Verbose mode prints information about new memory allocation
|
||
|
Verbose bool
|
||
|
// Hasher used to map between string keys and unsigned 64bit integers, by default fnv64 hashing is used.
|
||
|
Hasher Hasher
|
||
|
// HardMaxCacheSize is a limit for cache size in MB. Cache will not allocate more memory than this limit.
|
||
|
// It can protect application from consuming all available memory on machine, therefore from running OOM Killer.
|
||
|
// Default value is 0 which means unlimited size. When the limit is higher than 0 and reached then
|
||
|
// the oldest entries are overridden for the new ones.
|
||
|
HardMaxCacheSize int
|
||
|
// OnRemove 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.
|
||
|
// Default value is nil which means no callback and it prevents from unwrapping the oldest entry.
|
||
|
OnRemove func(key string, entry []byte)
|
||
|
// 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 func(key string, entry []byte, reason RemoveReason)
|
||
|
|
||
|
onRemoveFilter int
|
||
|
|
||
|
// Logger is a logging interface and used in combination with `Verbose`
|
||
|
// Defaults to `DefaultLogger()`
|
||
|
Logger Logger
|
||
|
}
|
||
|
|
||
|
// DefaultConfig initializes config with default values.
|
||
|
// When load for BigCache can be predicted in advance then it is better to use custom config.
|
||
|
func DefaultConfig(eviction time.Duration) Config {
|
||
|
return Config{
|
||
|
Shards: 1024,
|
||
|
LifeWindow: eviction,
|
||
|
CleanWindow: 0,
|
||
|
MaxEntriesInWindow: 1000 * 10 * 60,
|
||
|
MaxEntrySize: 500,
|
||
|
Verbose: true,
|
||
|
Hasher: newDefaultHasher(),
|
||
|
HardMaxCacheSize: 0,
|
||
|
Logger: DefaultLogger(),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// initialShardSize computes initial shard size
|
||
|
func (c Config) initialShardSize() int {
|
||
|
return max(c.MaxEntriesInWindow/c.Shards, minimumEntriesInShard)
|
||
|
}
|
||
|
|
||
|
// maximumShardSize computes maximum shard size
|
||
|
func (c Config) maximumShardSize() int {
|
||
|
maxShardSize := 0
|
||
|
|
||
|
if c.HardMaxCacheSize > 0 {
|
||
|
maxShardSize = convertMBToBytes(c.HardMaxCacheSize) / c.Shards
|
||
|
}
|
||
|
|
||
|
return maxShardSize
|
||
|
}
|
||
|
|
||
|
// OnRemoveFilterSet sets which remove reasons will trigger a call to OnRemoveWithReason.
|
||
|
// Filtering out reasons prevents bigcache from unwrapping them, which saves cpu.
|
||
|
func (c Config) OnRemoveFilterSet(reasons ...RemoveReason) Config {
|
||
|
c.onRemoveFilter = 0
|
||
|
for i := range reasons {
|
||
|
c.onRemoveFilter |= 1 << uint(reasons[i])
|
||
|
}
|
||
|
|
||
|
return c
|
||
|
}
|