127 lines
3.3 KiB
Go
127 lines
3.3 KiB
Go
package redis
|
|
|
|
import (
|
|
"context"
|
|
"sipro-mps/internal/config"
|
|
|
|
"github.com/redis/rueidis"
|
|
"go.uber.org/fx"
|
|
)
|
|
|
|
func NewRedisClient(lc fx.Lifecycle, config config.Config) (rueidis.Client, error) {
|
|
var err error
|
|
host := config.Redis.Host
|
|
port := config.Redis.Port
|
|
password := config.Redis.Password
|
|
|
|
client, err := rueidis.NewClient(rueidis.ClientOption{
|
|
InitAddress: []string{host + ":" + port},
|
|
Password: password,
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
lc.Append(fx.Hook{
|
|
OnStart: func(ctx context.Context) error {
|
|
return client.Do(ctx, client.B().Ping().Build()).Error()
|
|
},
|
|
OnStop: func(ctx context.Context) error {
|
|
client.Close()
|
|
return nil
|
|
},
|
|
})
|
|
return client, nil
|
|
}
|
|
|
|
//func CloseClient() {
|
|
// if Client != nil {
|
|
// (*Client).Close()
|
|
// }
|
|
//}
|
|
//
|
|
//// WriteProtoMessage compresses and writes a protobuf message to Redis
|
|
//func WriteProtoMessage(ctx context.Context, key string, message proto.Message, ttl ...time.Duration) error {
|
|
// if Client == nil {
|
|
// return fmt.Errorf("redis client not initialized")
|
|
// }
|
|
// if message == nil {
|
|
// return fmt.Errorf("message is nil")
|
|
// }
|
|
//
|
|
// // Marshal protobuf message
|
|
// bytesMessage, err := proto.Marshal(message)
|
|
// if err != nil {
|
|
// return fmt.Errorf("failed to marshal proto message: %w", err)
|
|
// }
|
|
//
|
|
// // Compress with zlib
|
|
// var buf bytes.Buffer
|
|
// w, err := zlib.NewWriterLevel(&buf, flate.BestCompression)
|
|
// if err != nil {
|
|
// return fmt.Errorf("failed to create zlib writer: %w", err)
|
|
// }
|
|
// defer w.Close() // гарантированное закрытие
|
|
//
|
|
// if _, err := w.Write(bytesMessage); err != nil {
|
|
// return fmt.Errorf("failed to write to zlib writer: %w", err)
|
|
// }
|
|
// if err := w.Close(); err != nil { // финализируем сжатие
|
|
// return fmt.Errorf("failed to close zlib writer: %w", err)
|
|
// }
|
|
//
|
|
// //var ttlDuration time.Duration
|
|
// //if len(ttl) > 0 {
|
|
// // ttlDuration = ttl[0]
|
|
// //} else {
|
|
// // ttlDuration = 3 * time.Hour // Default TTL of 24 hours
|
|
// //}
|
|
// // Write to Redis
|
|
// if err := (*Client).Do(ctx, (*Client).B().
|
|
// Set().
|
|
// Key(key).
|
|
// Value(rueidis.BinaryString(buf.Bytes())).
|
|
// Build()).
|
|
// Error(); err != nil {
|
|
// return fmt.Errorf("failed to write compressed data to Redis: %w", err)
|
|
// }
|
|
// return nil
|
|
//}
|
|
//
|
|
//// ReadProtoMessage reads and decompresses a protobuf message from Redis
|
|
//func ReadProtoMessage(ctx context.Context, key string, message proto.Message) error {
|
|
// if Client == nil {
|
|
// return fmt.Errorf("redis client not initialized")
|
|
// }
|
|
// if message == nil {
|
|
// return fmt.Errorf("message is nil")
|
|
// }
|
|
//
|
|
// // Get bytes from Redis
|
|
// resp, err := (*Client).Do(ctx, (*Client).B().Get().Key(key).Build()).AsBytes()
|
|
// if err != nil {
|
|
// return fmt.Errorf("failed to read data from Redis: %w", err)
|
|
// }
|
|
// if resp == nil {
|
|
// return fmt.Errorf("no data found for key: %s", key)
|
|
// }
|
|
//
|
|
// // Decompress
|
|
// reader, err := zlib.NewReader(bytes.NewReader(resp))
|
|
// if err != nil {
|
|
// return fmt.Errorf("failed to create zlib reader: %w", err)
|
|
// }
|
|
// defer reader.Close()
|
|
//
|
|
// decompressed, err := io.ReadAll(reader)
|
|
// if err != nil {
|
|
// return fmt.Errorf("failed to decompress data: %w", err)
|
|
// }
|
|
//
|
|
// // Unmarshal protobuf
|
|
// if err := proto.Unmarshal(decompressed, message); err != nil {
|
|
// return fmt.Errorf("failed to unmarshal proto message: %w", err)
|
|
// }
|
|
//
|
|
// return nil
|
|
//}
|