// DebouncedIncr - 带防抖的自增器
type DebouncedIncr struct {
local *Local
mu sync.Mutex
debounce map[interface{}]time.Time // 记录每个key的上次执行时间
}
func NewDebouncedIncr(local *Local) *DebouncedIncr {
return &DebouncedIncr{
local: local,
debounce: make(map[interface{}]time.Time),
}
}
func (d *DebouncedIncr) IncrWithDebounce(key interface{}, increment int64, expire time.Duration, debounce time.Duration) (int64, bool) {
d.mu.Lock()
lastTime, exists := d.debounce[key]
now := time.Now()
// 检查是否需要防抖
if exists && now.Sub(lastTime) < debounce {
d.mu.Unlock()
// 在防抖期内,只返回当前值,不自增
return d.local.Get(key), false
}
// 更新防抖时间
d.debounce[key] = now
d.mu.Unlock()
// 执行实际的自增
return d.local.IncrWithExpiry(key, increment, expire)
}
// 清理过期的防抖记录(可选)
func (d *DebouncedIncr) CleanupDebounce(olderThan time.Duration) {
d.mu.Lock()
defer d.mu.Unlock()
now := time.Now()
for key, lastTime := range d.debounce {
if now.Sub(lastTime) > olderThan {
delete(d.debounce, key)
}
}
}