package
1.3.0
Repository: https://github.com/gowins/dionysus.git
Documentation: pkg.go.dev

# README

配置

type ConfigOpt func(*bigcache.Config)
  • Shards int

分片数量,必须是2的幂次方, 例如21,22....;

// 即shards切片长度
shards []*cacheShard
  • LifeWindow time.Duration

    • 整体缓存过期时间;
    • 若CleanWindow大于0,每隔CleanWindow时间间隔,过期的缓存会被自动清理;
    • 否则,bigcache在每次设置缓存时,会判断最早的缓存是否过期,若过期,则清理;
  • CleanWindow time.Duration

若大于0,则会定期自动删除缓存时间超过LifeWindow

	if config.CleanWindow > 0 {
		go func() {
			ticker := time.NewTicker(config.CleanWindow)
			defer ticker.Stop()
			for {
				select {
				case <-ctx.Done():
					fmt.Println("ctx done, shutting down bigcache cleanup routine")
					return
				case t := <-ticker.C:
					cache.cleanUp(uint64(t.Unix()))
				case <-cache.close:
					return
				}
			}
		}()
	}

  • MaxEntriesInWindow int

必须大于0,用于计算每个shard的初始大小

// initialShardSize computes initial shard size
max(MaxEntriesInWindow/Shards, 10)
  • MaxEntrySize int

每个实体最大的内存大小,单位byte,必须大于0

// queue.ByteQueue.capacity大小,若此值大于HardMaxCacheSize,则取HardMaxCacheSize
max(MaxEntriesInWindow/Shards, 10) * MaxEntrySize
  • StatsEnabled bool

若开启,各个cacheShard分片会统计每个key的命中次数

  • Verbose bool

若开启,会打印新内存分配的信息

  • Hasher bigchache.Hasher

为key生成无符号的64位整数哈希值

// bigchache
type Hasher interface {
  Sum64(key string) uint64
}
  • HardMaxCacheSize int

每个分片,缓存(queue.ByteQueue)最大内存大小,单位MB,若为0,则表示没有限制

使用

func main() {
  cacheName := "cacheDemo"
  err := memcache.NewBigCache(context.Background(), cacheName, memcache.WithCleanWindow(time.Minute), memcache.WithLifeWindow(50*time.Second))
  if err != nil {
    fmt.Printf("new memory cache error %v\n", err)
  }
  memcache.Set(cacheName, "key9999999", []byte("key9999999"))
  startTime := time.Now()
  data, err := memcache.Get(cacheName, "key9999999")
  fmt.Printf("spend time %v\n", time.Now().UnixMicro()-startTime.UnixMicro())
  if err != nil {
    fmt.Printf("memory cache Get error %v\n", err)
    return
  }
  fmt.Printf("data is %v\n", string(data))
}

由于bigcache有一个整体的过期时间和清理策略,通过CleanWindow来控制清理时间间隔,以及LifeWindow来控制整体缓存的有效时间;

在使用时,注意LifeWindow与这里设置的过期时间,建议把LifeWindow设置比TTL大一些,避免被bigcache自动清理,例如1分钟

需要调用c.Close()或者通过取消上下文,让bigcache定时器goroutine退出

Benchmarks

1: 50秒有效期,1分钟清理窗口配置下,1000万数据下,100并发写,100并发读,平均延时1微秒延时,最高延时30微妙。
bench test

goos: darwin
goarch: arm64
pkg: github.com/gowins/dionysus/memcache
BenchmarkBigCacheSet-8           	17409649	       382.0 ns/op	     152 B/op	       2 allocs/op
BenchmarkBigCacheGet-8           	16806682	       278.9 ns/op	      85 B/op	       2 allocs/op
BenchmarkBigCacheSetParallel-8   	41394356	       134.9 ns/op	     117 B/op	       3 allocs/op
BenchmarkBigCacheGetParallel-8   	44905400	        92.14 ns/op	      23 B/op	       1 allocs/op
PASS
ok  	github.com/gowins/dionysus/memcache	49.881s

2: GC pause time

go version
go version go1.19 linux/amd64

go run caches_gc_overhead_comparison.go

Number of entries:  10000000
GC pause for bigcache:  0.306077ms
Number of entries:  20000000
GC pause for bigcache:  0.506077ms