From 6c9cf2dcfbb0cd4f01441b081b809eabba813f52 Mon Sep 17 00:00:00 2001 From: tangmingyou <234767776@qq.com> Date: Mon, 27 Feb 2023 18:01:49 +0800 Subject: [PATCH] delay queue --- cmd/main.go | 12 +++++++++- go.mod | 1 + go.sum | 2 ++ tool/collect/delay_queue.go | 47 +++++++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tool/collect/delay_queue.go diff --git a/cmd/main.go b/cmd/main.go index 01919db..f821a27 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -20,5 +20,15 @@ func startServer() { } 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) + } diff --git a/go.mod b/go.mod index 6fe3c66..763332f 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( ) require ( + github.com/emirpasic/gods v1.18.1 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect diff --git a/go.sum b/go.sum index 6a94411..c2c56c5 100644 --- a/go.sum +++ b/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/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o= 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/go.mod h1:vYAuaUPqie3WUSsft6HUlCjlwwoJQs97miaG2+7neKY= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= diff --git a/tool/collect/delay_queue.go b/tool/collect/delay_queue.go new file mode 100644 index 0000000..6cf7b60 --- /dev/null +++ b/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 +}