Browse Source

delay queue

master
tangmingyou 4 years ago
parent
commit
6c9cf2dcfb
  1. 12
      cmd/main.go
  2. 1
      go.mod
  3. 2
      go.sum
  4. 47
      tool/collect/delay_queue.go

12
cmd/main.go

@ -20,5 +20,15 @@ func startServer() {
} }
func main() { func main() {
startServer() //startServer()
ms := time.Now().UnixMilli()
now := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
fmt.Println(ms)
fmt.Println(ms << 22)
fmt.Println(ms - now.UnixMilli())
key := (ms-now.UnixMilli())<<22 + 138
fmt.Println(key >> 22)
fmt.Println(key << 42 >> 42)
} }

1
go.mod

@ -15,6 +15,7 @@ require (
) )
require ( require (
github.com/emirpasic/gods v1.18.1 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect

2
go.sum

@ -8,6 +8,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o= github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo= github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE= github.com/gin-contrib/sessions v0.0.5 h1:CATtfHmLMQrMNpJRgzjWXD7worTh7g7ritsQfmF+0jE=
github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= github.com/gin-contrib/sessions v0.0.5/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=

47
tool/collect/delay_queue.go

@ -0,0 +1,47 @@
package collect
import (
"fmt"
"github.com/emirpasic/gods/maps/treemap"
"sync"
"time"
)
// DelayQueue key: int64(64bit) = 1(0固定值)+41(ms)+22(index)
type DelayQueue[T any] struct {
taskQueueMap *treemap.Map
lock *sync.RWMutex
offsetMs int64
}
func NewDelayQueue[T any](handler func(data T)) {
q := &DelayQueue[T]{}
q.taskQueueMap = treemap.NewWithIntComparator()
q.lock = &sync.RWMutex{}
q.offsetMs = time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC).UnixMilli()
}
func (q *DelayQueue[T]) Add(after time.Duration, data T) int64 {
ms := time.Now().UnixMilli() + after.Milliseconds()
q.lock.Lock()
defer q.lock.Unlock()
val, found := q.taskQueueMap.Get(ms)
if !found {
q.taskQueueMap.Put(ms, []T{data})
return ms
}
q.taskQueueMap.Put(ms, append(val.([]T), data))
return 1
}
func (q *DelayQueue[T]) genKey(ms int64, index int) int64 {
key := (ms-q.offsetMs)<<22 + int64(index)
return key
}
func parseKey(key int64) (int64, int) {
fmt.Println(key >> 22)
fmt.Println(key << 42 >> 42)
return 0, 0
}
Loading…
Cancel
Save