# 4.9 调用本地缓存
# 4.9.1 简介
pkg/cache 包支持多个本地缓存库,并支持metric上报
# 1 支持的本地缓存库
描述 | 库地址 |
---|---|
freecache库 | github.com/coocood/freecache (opens new window) |
golang-lru库 | github.com/hnlq715/golang-lru (opens new window) |
# 2 freecache配置规范
[jupiter.cache]
# freecache本地缓存总容量 默认256MB
# 缓存value的大小需要小于缓存总容量的1/1024,否则无法存入到本地缓存中
# 可支持单位: B或Btye、KB、MB、GB、TB (大小写均支持)
size = "256MB" # 【可选】
[jupiter.cache.student]
expire = "2m" # 【必填】本地缓存失效时间
disableMetric = false # 【可选】是否禁用metric上报 false 开启 ture 关闭 默认开启上报
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# freecache特性与使用注意事项
特性:
- 可存储数以百万计条目
- 零垃圾收集负荷
- 高并发而且线程安全的访问
- 纯 Go 语言实现
- 支持对象失效
- 近乎 LRU 的算法
- 严格限制内存使用
使用注意事项:
- 缓存key的大小需要小于65535,否则无法存入到本地缓存中(The key is larger than 65535)
- 缓存value的大小需要小于缓存总容量的1/1024,否则无法存入到本地缓存中(The entry size need less than 1/1024 of cache size)
# 3 golang-lru配置规范
[jupiter.xgolanglru]
# golang-lru 每个配置都会新增一个实例
[jupiter.xgolanglru.student]
expire = "2m" # 【必填】本地缓存失效时间
size = 200000 # 【可选】
disableMetric = false # 【可选】是否禁用metric上报 false 开启 ture 关闭 默认开启上报
1
2
3
4
5
6
2
3
4
5
6
# 4.9.2 使用方法
# 1 前言
需要使用golang-lru库只需要将包名从github.com/douyu/jupiter/pkg/cache/xfreecache/v2
换成github.com/douyu/jupiter/pkg/cache/xgolanglru
即可,juno配置项换成golang-lru配置规范
# 2 初始化实例
import (
"github.com/douyu/jupiter/pkg/cache"
"github.com/douyu/jupiter/pkg/cache/xfreecache/v2"
)
type Student struct {
Age int
Name string
}
type Instance struct {
localCache *cache.Cache[string, Student]
}
func NewInstance() *Instance {
return &Instance{
localCache: xfreecache.StdNew[string, Student]("student"),
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- 若juno中无配置时,会初始化一个默认配置。默认配置详情:缓存容量:
256MB
(缓存value需要小于256KB) 失效时间:2分钟
是否开启metric上报:是
- 初始化多个配置时,内部只会初始化一个缓存容量为256MB的缓存实例。无需担心初始化多个实例后的缓存消耗
# 3 函数方法介绍
// GetAndSetCacheData 获取缓存后数据(内部已封装设置和获取本地缓存操作)【推荐使用】
// key 缓存key
// id 索引(无作用,会组装到key里面)
// fn 获取返回数据需要执行的方法
// value
// err fn返回的错误以及其他报错
func (c *cache[K, V]) GetAndSetCacheData(key string, id K, fn func() (V, error)) (value V, err error)
// GetCacheValue 获取缓存数据
// key 缓存key
// id 索引(无作用,会组装到key里面)
// value
func (c *cache[K, V]) GetCacheValue(key string, id K) (value V)
// SetCacheValue 设置缓存数据
// key 缓存key
// id 索引(无作用,会组装到key里面)
// fn 获取返回数据需要执行的方法
// err fn返回的错误以及其他报错
func (c *cache[K, V]) SetCacheValue(key string, id K, fn func() (V, error)) (err error)
// GetAndSetCacheMap 获取缓存后数据 map形式 【推荐使用】
// key 缓存key
// ids 返回map中的key集合
// fn 获取返回数据需要执行的方法
// value
// err fn返回的错误以及其他报错
func (c *cache[K, V]) GetAndSetCacheMap(key string, ids []K, fn func([]K) (map[K]V, error)) (v map[K]V, err error)
// GetCacheMap 获取缓存数据 map形式
// key 缓存key
// ids 返回map中的key集合
// value
func (c *cache[K, V]) GetCacheMap(key string, ids []K) (v map[K]V)
// SetCacheMap 设置缓存数据 map形式
// key 缓存key
// ids 返回map中的key集合
// fn 获取返回数据需要执行的方法
// err fn返回的错误以及其他报错
func (c *cache[K, V]) SetCacheMap(key string, ids []K, fn func([]K) (map[K]V, error)) (err error)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 4 实际案例
配置项
[jupiter.cache.bwlist]
expire = "1m" # 本地缓存失效时间
1
2
2
代码
package bwlist
import (
"context"
"github.com/douyu/jupiter/pkg/cache"
"github.com/douyu/jupiter/pkg/cache/xfreecache/v2"
)
type Instance struct {
localCache *cache.Cache[int32, []int32]
}
func NewInstance() *Instance {
return &Instance{
localCache: xfreecache.StdNew[int32, []int32]("bwlist"),
}
}
// GetBWListCached 获取单个白名单配置-带1min本地缓存
// id 白名单配置id
func (i *Instance) GetBWListCached(ctx context.Context, id int32) (res []int32, err error) {
res, err = i.localCache.GetAndSetCacheData("bwlist.GetBWList", id, func() ([]int32, error) {
data, innerErr := i.GetBWList(ctx, id)
return data, innerErr
})
return
}
// BatchGetBWListCached 批量获取白名单配置-带1min本地缓存
// ids 多个白名单配置id
func (i *Instance) BatchGetBWListCached(ctx context.Context, ids []int32) (res map[int32][]int32, err error) {
res, err = i.localCache.GetAndSetCacheMap("bwlist.GetBWList", ids, func(innerIds []int32) (map[int32][]int32, error) {
data, innerErr := i.BatchGetBWList(ctx, innerIds)
return data, innerErr
})
return
}
// GetBWList 获取单个白名单配置-不带缓存
// id 白名单配置id
func (i *Instance) GetBWList(ctx context.Context, id int32) (res []int32, err error) {
// TODO 可以根据实际业务具体实现方法
return
}
// BatchGetBWList 批量获取白名单配置-不带缓存
// ids 多个白名单配置id
func (i *Instance) BatchGetBWList(ctx context.Context, id []int32) (res map[int32][]int32, err error) {
// TODO 可以根据实际业务具体实现方法
return
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 4.9.3 juno监控
← 4.8 调用Trace 5.1 概述 →