https://github.com/nekomeowww/timecapsule
A Redis based task scheduling module written in Golang.
https://github.com/nekomeowww/timecapsule
delayed-job delayed-queue delayed-tasks golang-library redis task-queue task-scheduler
Last synced: 8 months ago
JSON representation
A Redis based task scheduling module written in Golang.
- Host: GitHub
- URL: https://github.com/nekomeowww/timecapsule
- Owner: nekomeowww
- License: mit
- Created: 2022-10-11T03:01:53.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2025-10-01T06:50:45.000Z (8 months ago)
- Last Synced: 2025-10-01T08:41:05.384Z (8 months ago)
- Topics: delayed-job, delayed-queue, delayed-tasks, golang-library, redis, task-queue, task-scheduler
- Language: Go
- Homepage:
- Size: 84 KB
- Stars: 9
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# TimeCapsule
[](https://goreportcard.com/report/github.com/nekomeowww/timecapsule)
[](https://github.com/nekomeowww/timecapsule/actions/workflows/unittest.yaml)
TimeCapsule is a Redis based task scheduling module written in Golang. It is designed to be used as a library in your own application. It is not a standalone application.
As the name suggests, it is inspired by the concept of **time capsule** which is designed to be used in a similar way.
You can schedule tasks to be executed at a specific time in the future just like you buried a time capsule, and use this module to periodically look for tasks that are due to be executed from the dataloader. Once a task is due, it will be executed and removed from the dataloader.
Features:
- [x] Golang 1.18 Generic support
- [X] Customizable dataloader for performing task scheduling and execution
## Installation
```bash
go get github.com/nekomeowww/timecapsule
```
## Usage
```go
package main
import (
"fmt"
"time"
"github.com/nekomeowww/timecapsule"
)
func main() {
// initialize redis dataloader
redisDataloder := NewRedisDataloader[string]("some/task/key", redis.NewClient(&redis.Options{
Addr: net.JoinHostPort("localhost", "6379"),
Password: "123456",
}))
// create a time capsule digger, pass 250*time.Millisecond into parameter as the interval
digger := NewDigger[string](redisDataloder, 250*time.Millisecond)
// set task handler function
digger.SetHandler(func(capsule *TimeCapsule[string]) {
fmt.Println("task", capsule.Payload, "is due") // print a message
})
// start digging in a seperated goroutine
go digger.Start()
// defer stop digging
defer digger.Stop()
// Bury a time capsule
err = digger.BuryFor("this is a time capsule", time.Second)
if err != nil {
logger.Error(err)
}
err = digger.BuryUntil("this is a time capsule", time.Now().UTC().Add(time.Second).UnixMilli())
if err != nil {
logger.Error(err)
}
}
```