/
option.go
66 lines (56 loc) · 1.94 KB
/
option.go
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package fcache
import (
"sync"
"github.com/693490554/sponge/rdscache/common"
)
// fCacheOption 函数缓存可选项
type fCacheOption struct {
lock sync.Locker // 预防缓存击穿时,需要传入lock
needCacheNoData bool // 是否需要缓存函数不存在数据的情况,默认不需要
// todo: data需传入非nil指针, 如果为nil反序列化将失败
data interface{} // data != nil 代表需要将结果UnMarshal到data中
// getFromRdsCallBack,从redis获取数据时的回调函数,可用于做监控,及热key实时统计等功能
getFromRdsCallBack func()
// hotKeyOption 预防热key选项
// 支持分片处理热key问题或本地缓存处理热key问题
// 业务方通过getFromRdsCallBack回调可自行实现热key实时统计, 通过注册isHotKey函数,可以实现动态热key处理
hotKeyOption *common.HotKeyOption
}
func NewFCacheOption(opts ...FCOptionWrap) *fCacheOption {
option := &fCacheOption{}
for _, o := range opts {
o(option)
}
return option
}
type FCOptionWrap func(o *fCacheOption)
// WithLock 使用锁,防止缓存击穿
func WithLock(lock sync.Locker) FCOptionWrap {
return func(option *fCacheOption) {
option.lock = lock
}
}
// WithNeedCacheNoData 需要缓存数据不存在,预防缓存穿透
func WithNeedCacheNoData() FCOptionWrap {
return func(option *fCacheOption) {
option.needCacheNoData = true
}
}
// WithUnMarshalData 需要将缓存结果反序列化
func WithUnMarshalData(data interface{}) FCOptionWrap {
return func(option *fCacheOption) {
option.data = data
}
}
// WithGetFromRdsCallBack 注册从redis获取数据的回调函数
func WithGetFromRdsCallBack(cb func()) FCOptionWrap {
return func(option *fCacheOption) {
option.getFromRdsCallBack = cb
}
}
// WithRdsVisitCallBack 注册redis访问回调
func WithHotKeyOption(hotKeyOption *common.HotKeyOption) FCOptionWrap {
return func(option *fCacheOption) {
option.hotKeyOption = hotKeyOption
}
}