61 lines
1.2 KiB
Go
61 lines
1.2 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"git.0x7f.app/WOJ/woj-server/internal/misc/config"
|
|
"git.0x7f.app/WOJ/woj-server/internal/misc/log"
|
|
"github.com/redis/go-redis/v9"
|
|
"github.com/samber/do"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
var _ Service = (*service)(nil)
|
|
|
|
type Service interface {
|
|
Get() *redis.Client
|
|
Close() error
|
|
HealthCheck() error
|
|
}
|
|
|
|
func NewService(i *do.Injector) (Service, error) {
|
|
srv := &service{}
|
|
srv.log = do.MustInvoke[log.Service](i).GetLogger("redis")
|
|
|
|
conf := do.MustInvoke[config.Service](i).GetConfig()
|
|
srv.setup(fmt.Sprintf("%s:%d", conf.Redis.Address, conf.Redis.Port), conf.Redis.Password, conf.Redis.Db)
|
|
return srv, srv.err
|
|
}
|
|
|
|
type service struct {
|
|
log *zap.Logger
|
|
client *redis.Client
|
|
err error
|
|
}
|
|
|
|
func (s *service) Get() *redis.Client {
|
|
return s.client
|
|
}
|
|
|
|
func (s *service) Close() error {
|
|
return s.client.Close()
|
|
}
|
|
|
|
func (s *service) HealthCheck() error {
|
|
return s.err
|
|
}
|
|
|
|
func (s *service) setup(addr string, password string, db int) {
|
|
s.client = redis.NewClient(&redis.Options{
|
|
Addr: addr,
|
|
Password: password,
|
|
DB: db,
|
|
})
|
|
|
|
_, s.err = s.client.Ping(context.Background()).Result()
|
|
if s.err != nil {
|
|
s.log.Error("Redis ping failed", zap.Error(s.err))
|
|
return
|
|
}
|
|
}
|