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 } }