From 681b737f2fee8553d7826731f9e7fcfe13d41217 Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Wed, 26 Nov 2025 20:46:40 +0700 Subject: [PATCH] feat: init --- redis/.env.example | 1 + redis/.gitignore | 4 +++ redis/go.mod | 15 ++++++++++ redis/go.sum | 12 ++++++++ redis/main.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 redis/.env.example create mode 100644 redis/go.mod create mode 100644 redis/go.sum create mode 100644 redis/main.go diff --git a/redis/.env.example b/redis/.env.example new file mode 100644 index 0000000..90b5465 --- /dev/null +++ b/redis/.env.example @@ -0,0 +1 @@ +REDIS_URL=redis://default@127.0.0.1:6379 diff --git a/redis/.gitignore b/redis/.gitignore index aaadf73..089a213 100644 --- a/redis/.gitignore +++ b/redis/.gitignore @@ -1,3 +1,7 @@ +.idea + + + # If you prefer the allow list template instead of the deny list, see community template: # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore # diff --git a/redis/go.mod b/redis/go.mod new file mode 100644 index 0000000..8e20e90 --- /dev/null +++ b/redis/go.mod @@ -0,0 +1,15 @@ +module github.com/tiennm99/redis-keepalive + +go 1.23.12 + +toolchain go1.24.10 + +require ( + github.com/joho/godotenv v1.5.1 + github.com/redis/go-redis/v9 v9.17.1 +) + +require ( + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect +) diff --git a/redis/go.sum b/redis/go.sum new file mode 100644 index 0000000..7b5b378 --- /dev/null +++ b/redis/go.sum @@ -0,0 +1,12 @@ +github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= +github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= +github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= +github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/redis/go-redis/v9 v9.17.1 h1:7tl732FjYPRT9H9aNfyTwKg9iTETjWjGKEJ2t/5iWTs= +github.com/redis/go-redis/v9 v9.17.1/go.mod h1:u410H11HMLoB+TP67dz8rL9s6QW2j76l0//kSOd3370= diff --git a/redis/main.go b/redis/main.go new file mode 100644 index 0000000..82d4107 --- /dev/null +++ b/redis/main.go @@ -0,0 +1,73 @@ +package main + +import ( + "context" + "log" + "os" + "os/signal" + "syscall" + "time" + + "github.com/joho/godotenv" + "github.com/redis/go-redis/v9" +) + +func main() { + if err := godotenv.Load(); err != nil { + log.Println("Warning: .env file not found") + } + + redisUrl, isExist := os.LookupEnv("REDIS_URL") + if !isExist { + log.Fatal("Warning: REDIS_URL not set!") + return + } + + opt, err := redis.ParseURL(redisUrl) + if err != nil { + panic(err) + } + + rdb := redis.NewClient(opt) + + ctx, cancel := context.WithCancel(context.Background()) + + go func() { + ticker := time.NewTicker(time.Minute) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + if err := incrementCounter(ctx, rdb); err != nil { + log.Printf("Keepalive increment error: %v", err) + } + case <-ctx.Done(): + return + } + } + }() + + defer func() { + cancel() + if err := rdb.Close(); err != nil { + log.Printf("Error closing cluster: %v", err) + } + }() + + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) + <-sigCh +} + +func incrementCounter(ctx context.Context, rdb *redis.Client) error { + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + counterDocId := "counter" + increment, err := rdb.Incr(ctx, counterDocId).Result() + if err != nil { + return err + } + log.Printf("Counter : %d\n", increment) + return nil +}