暂不考虑并发问题,增加自定存储源功能
This commit is contained in:
parent
058d0ccf73
commit
650b8d69b7
|
@ -11,6 +11,12 @@ func NewDataBuried[DataID comparable, Data any](hitLogic HitLogic[Data], options
|
||||||
data: asynchronization.NewMap[DataID, Data](),
|
data: asynchronization.NewMap[DataID, Data](),
|
||||||
hitLogic: hitLogic,
|
hitLogic: hitLogic,
|
||||||
}
|
}
|
||||||
|
buried.setData = func(id DataID, data Data) {
|
||||||
|
buried.data.Set(id, data)
|
||||||
|
}
|
||||||
|
buried.getData = func(id DataID) Data {
|
||||||
|
return buried.data.Get(id)
|
||||||
|
}
|
||||||
for _, option := range options {
|
for _, option := range options {
|
||||||
option(buried)
|
option(buried)
|
||||||
}
|
}
|
||||||
|
@ -22,18 +28,18 @@ func NewDataBuried[DataID comparable, Data any](hitLogic HitLogic[Data], options
|
||||||
type DataBuried[DataID comparable, Data any] struct {
|
type DataBuried[DataID comparable, Data any] struct {
|
||||||
data hash.Map[DataID, Data]
|
data hash.Map[DataID, Data]
|
||||||
hitLogic HitLogic[Data]
|
hitLogic HitLogic[Data]
|
||||||
|
getData func(DataID) Data
|
||||||
|
setData func(id DataID, data Data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hit 命中数据埋点
|
// Hit 命中数据埋点
|
||||||
func (slf *DataBuried[DataID, Data]) Hit(id DataID, data Data) {
|
func (slf *DataBuried[DataID, Data]) Hit(id DataID, data Data) {
|
||||||
slf.data.Atom(func(m hash.Map[DataID, Data]) {
|
slf.setData(id, slf.hitLogic(slf.getData(id), data))
|
||||||
m.Set(id, slf.hitLogic(m.Get(id), data))
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetData 获取数据
|
// GetData 获取数据
|
||||||
func (slf *DataBuried[DataID, Data]) GetData(id DataID) Data {
|
func (slf *DataBuried[DataID, Data]) GetData(id DataID) Data {
|
||||||
return slf.data.Get(id)
|
return slf.getData(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetSize 获取已触发该埋点的id数量
|
// GetSize 获取已触发该埋点的id数量
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
package report
|
package report
|
||||||
|
|
||||||
import "github.com/kercylan98/minotaur/utils/synchronization"
|
|
||||||
|
|
||||||
type DataBuriedOption[DataID comparable, Data any] func(buried *DataBuried[DataID, Data])
|
type DataBuriedOption[DataID comparable, Data any] func(buried *DataBuried[DataID, Data])
|
||||||
|
|
||||||
// WithDataBuriedSync 通过并发安全的方式创建数据埋点
|
// WithDataBuriedStorage 通过特定的存储模式创建数据埋点
|
||||||
func WithDataBuriedSync[DataId comparable, Data any]() DataBuriedOption[DataId, Data] {
|
// - 默认情况下埋点数据存储在内存中
|
||||||
return func(buried *DataBuried[DataId, Data]) {
|
// - 使用该方式可以将埋点存储存储在其他如数据库、消息队列中
|
||||||
buried.data = synchronization.NewMap[DataId, Data]()
|
func WithDataBuriedStorage[DataID comparable, Data any](getData func(id DataID) Data, setData func(id DataID, data Data)) DataBuriedOption[DataID, Data] {
|
||||||
|
return func(buried *DataBuried[DataID, Data]) {
|
||||||
|
buried.getData = getData
|
||||||
|
buried.setData = setData
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,35 +1,37 @@
|
||||||
package report
|
package report
|
||||||
|
|
||||||
import (
|
|
||||||
"sync"
|
|
||||||
)
|
|
||||||
|
|
||||||
// NewGlobalBuried 创建一个全局埋点
|
// NewGlobalBuried 创建一个全局埋点
|
||||||
func NewGlobalBuried[Data any](hitLogic HitLogic[Data]) *GlobalBuried[Data] {
|
func NewGlobalBuried[Data any](hitLogic HitLogic[Data], options ...GlobalBuriedOption[Data]) *GlobalBuried[Data] {
|
||||||
return &GlobalBuried[Data]{
|
buried := &GlobalBuried[Data]{
|
||||||
hitLogic: hitLogic,
|
hitLogic: hitLogic,
|
||||||
}
|
}
|
||||||
|
buried.setData = func(data Data) {
|
||||||
|
buried.data = data
|
||||||
|
}
|
||||||
|
buried.getData = func() Data {
|
||||||
|
return buried.data
|
||||||
|
}
|
||||||
|
for _, option := range options {
|
||||||
|
option(buried)
|
||||||
|
}
|
||||||
|
return buried
|
||||||
}
|
}
|
||||||
|
|
||||||
// GlobalBuried 全局埋点
|
// GlobalBuried 全局埋点
|
||||||
// - 天然并发安全
|
|
||||||
// - 全局埋点适用于活跃用户数等统计
|
// - 全局埋点适用于活跃用户数等统计
|
||||||
type GlobalBuried[Data any] struct {
|
type GlobalBuried[Data any] struct {
|
||||||
rw sync.RWMutex
|
|
||||||
data Data
|
data Data
|
||||||
hitLogic HitLogic[Data]
|
hitLogic HitLogic[Data]
|
||||||
|
getData func() Data
|
||||||
|
setData func(data Data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Hit 命中数据埋点
|
// Hit 命中数据埋点
|
||||||
func (slf *GlobalBuried[Data]) Hit(data Data) {
|
func (slf *GlobalBuried[Data]) Hit(data Data) {
|
||||||
slf.rw.Lock()
|
slf.setData(slf.hitLogic(slf.getData(), data))
|
||||||
defer slf.rw.Unlock()
|
|
||||||
slf.data = slf.hitLogic(slf.data, data)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetData 获取数据
|
// GetData 获取数据
|
||||||
func (slf *GlobalBuried[Data]) GetData() Data {
|
func (slf *GlobalBuried[Data]) GetData() Data {
|
||||||
slf.rw.RLock()
|
return slf.getData()
|
||||||
defer slf.rw.RUnlock()
|
|
||||||
return slf.data
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
package report
|
||||||
|
|
||||||
|
type GlobalBuriedOption[Data any] func(buried *GlobalBuried[Data])
|
||||||
|
|
||||||
|
// WithGlobalBuriedStorage 通过特定的存储模式创建全局埋点
|
||||||
|
// - 默认情况下埋点数据存储在内存中
|
||||||
|
// - 使用该方式可以将埋点存储存储在其他如数据库、消息队列中
|
||||||
|
func WithGlobalBuriedStorage[DataID comparable, Data any](getData func() Data, setData func(data Data)) GlobalBuriedOption[Data] {
|
||||||
|
return func(buried *GlobalBuried[Data]) {
|
||||||
|
buried.getData = getData
|
||||||
|
buried.setData = setData
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue