Files
app-api/internal/cache/model_cache.go
T
eafonyang 87bdad34fc 更新环境配置,优化数据库和Redis连接设置
- 修改`.env.example`文件,更新数据库和Redis的默认主机地址为`192.168.9.127`
- 在`docker-compose.yml`中移除不必要的卷挂载配置
- 在`go.mod`中添加`github.com/joho/godotenv`依赖以支持环境变量加载
- 更新`README.md`以反映新的数据库和Redis连接信息
- 在`main.go`中加载环境变量以支持动态配置
- 新增缓存存在性检查功能,避免重复预热缓存
- 优化CSV读取逻辑,支持从S3获取数据
2026-06-08 14:52:23 +08:00

78 lines
1.8 KiB
Go

package cache
import (
"context"
"encoding/json"
"fmt"
"time"
"github.com/luxsin/app-api/internal/model"
"github.com/redis/go-redis/v9"
)
const (
modelBrandPrefix = "model:brand:"
modelAllKey = "model:all"
modelTTL = 30 * time.Minute
)
type ModelCache struct {
rdb *redis.Client
}
func NewModelCache(rdb *redis.Client) *ModelCache {
return &ModelCache{rdb: rdb}
}
func (c *ModelCache) Exists(ctx context.Context) (bool, error) {
n, err := c.rdb.Exists(ctx, modelAllKey).Result()
if err != nil {
return false, err
}
return n > 0, nil
}
func modelBrandKey(brandName string) string {
return modelBrandPrefix + brandName
}
func (c *ModelCache) GetByBrand(ctx context.Context, brandName string) ([]model.Model, error) {
data, err := c.rdb.Get(ctx, modelBrandKey(brandName)).Bytes()
if err != nil {
return nil, err
}
var list []model.Model
if err := json.Unmarshal(data, &list); err != nil {
return nil, fmt.Errorf("unmarshal models: %w", err)
}
return list, nil
}
func (c *ModelCache) SetByBrand(ctx context.Context, brandName string, list []model.Model) error {
data, err := json.Marshal(list)
if err != nil {
return fmt.Errorf("marshal models: %w", err)
}
return c.rdb.Set(ctx, modelBrandKey(brandName), data, modelTTL).Err()
}
func (c *ModelCache) GetAll(ctx context.Context) ([]model.Model, error) {
data, err := c.rdb.Get(ctx, modelAllKey).Bytes()
if err != nil {
return nil, err
}
var list []model.Model
if err := json.Unmarshal(data, &list); err != nil {
return nil, fmt.Errorf("unmarshal models: %w", err)
}
return list, nil
}
func (c *ModelCache) SetAll(ctx context.Context, list []model.Model) error {
data, err := json.Marshal(list)
if err != nil {
return fmt.Errorf("marshal models: %w", err)
}
return c.rdb.Set(ctx, modelAllKey, data, modelTTL).Err()
}