feat: init

This commit is contained in:
2025-11-26 20:46:40 +07:00
parent 4d97f784c2
commit 681b737f2f
5 changed files with 105 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
REDIS_URL=redis://default@127.0.0.1:6379
+4
View File
@@ -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
#
+15
View File
@@ -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
)
+12
View File
@@ -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=
+73
View File
@@ -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
}