From b7670441996572d20ed89c9240eaf5c755867c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Tue, 13 May 2025 21:46:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=B8=BA=E8=AE=BE=E7=BD=AE=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=E7=BC=93=E5=AD=98=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/data/setting.go | 56 +++++++++++++++++++++++++++++++++++----- 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/internal/data/setting.go b/internal/data/setting.go index 1ed1c7b7..ab60ffaa 100644 --- a/internal/data/setting.go +++ b/internal/data/setting.go @@ -5,6 +5,7 @@ import ( "encoding/json" "errors" "path/filepath" + "sync" "github.com/go-rat/utils/hash" "github.com/go-rat/utils/str" @@ -27,10 +28,11 @@ import ( ) type settingRepo struct { - t *gotext.Locale - db *gorm.DB - conf *koanf.Koanf - task biz.TaskRepo + t *gotext.Locale + cache sync.Map + db *gorm.DB + conf *koanf.Koanf + task biz.TaskRepo } func NewSettingRepo(t *gotext.Locale, db *gorm.DB, conf *koanf.Koanf, task biz.TaskRepo) biz.SettingRepo { @@ -43,6 +45,13 @@ func NewSettingRepo(t *gotext.Locale, db *gorm.DB, conf *koanf.Koanf, task biz.T } func (r *settingRepo) Get(key biz.SettingKey, defaultValue ...string) (string, error) { + if cache, ok := r.cache.Load(key); ok { + if v, ok := cache.(string); ok { + return v, nil + } + r.cache.Delete(key) + } + setting := new(biz.Setting) if err := r.db.Where("key = ?", key).First(setting).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { @@ -58,6 +67,13 @@ func (r *settingRepo) Get(key biz.SettingKey, defaultValue ...string) (string, e } func (r *settingRepo) GetBool(key biz.SettingKey, defaultValue ...bool) (bool, error) { + if cache, ok := r.cache.Load(key); ok { + if v, ok := cache.(bool); ok { + return v, nil + } + r.cache.Delete(key) + } + setting := new(biz.Setting) if err := r.db.Where("key = ?", key).First(setting).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { @@ -73,6 +89,13 @@ func (r *settingRepo) GetBool(key biz.SettingKey, defaultValue ...bool) (bool, e } func (r *settingRepo) GetInt(key biz.SettingKey, defaultValue ...int) (int, error) { + if cache, ok := r.cache.Load(key); ok { + if v, ok := cache.(int); ok { + return v, nil + } + r.cache.Delete(key) + } + setting := new(biz.Setting) if err := r.db.Where("key = ?", key).First(setting).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { @@ -88,6 +111,13 @@ func (r *settingRepo) GetInt(key biz.SettingKey, defaultValue ...int) (int, erro } func (r *settingRepo) GetSlice(key biz.SettingKey, defaultValue ...[]string) ([]string, error) { + if cache, ok := r.cache.Load(key); ok { + if v, ok := cache.([]string); ok { + return v, nil + } + r.cache.Delete(key) + } + setting := new(biz.Setting) if err := r.db.Where("key = ?", key).First(setting).Error; err != nil { if !errors.Is(err, gorm.ErrRecordNotFound) { @@ -124,7 +154,13 @@ func (r *settingRepo) Set(key biz.SettingKey, value string) error { setting.Key = key setting.Value = value - return r.db.Save(setting).Error + if err := r.db.Save(setting).Error; err != nil { + return err + } + + r.cache.Store(key, value) + + return nil } func (r *settingRepo) SetSlice(key biz.SettingKey, value []string) error { @@ -146,7 +182,13 @@ func (r *settingRepo) SetSlice(key biz.SettingKey, value []string) error { setting.Value = string(b) } - return r.db.Save(setting).Error + if err := r.db.Save(setting).Error; err != nil { + return err + } + + r.cache.Store(key, value) + + return nil } func (r *settingRepo) Delete(key biz.SettingKey) error { @@ -155,6 +197,8 @@ func (r *settingRepo) Delete(key biz.SettingKey) error { return err } + r.cache.Delete(key) + return nil }