diff --git a/common/cache/ristretto.go b/common/cache/ristretto.go index 978c370..36ecf17 100644 --- a/common/cache/ristretto.go +++ b/common/cache/ristretto.go @@ -2,19 +2,19 @@ package cache import ( "fmt" + "time" "github.com/charmbracelet/log" "github.com/dgraph-io/ristretto/v2" + "github.com/krau/SaveAny-Bot/config" ) var cache *ristretto.Cache[string, any] - -// TODO: maybe we should use simple ttl cache instead of ristretto... func init() { c, err := ristretto.NewCache(&ristretto.Config[string, any]{ - NumCounters: 1e5, - MaxCost: 1e6, // 1000000 / 112 ≈ 8928 + NumCounters: config.Cfg.Cache.NumCounters, + MaxCost: config.Cfg.Cache.MaxCost, BufferItems: 64, OnReject: func(item *ristretto.Item[any]) { log.Warnf("Cache item rejected: key=%d, value=%v", item.Key, item.Value) @@ -27,7 +27,7 @@ func init() { } func Set(key string, value any) error { - ok := cache.Set(key, value, 0) + ok := cache.SetWithTTL(key, value, 0, time.Duration(config.Cfg.Cache.TTL)*time.Second) if !ok { return fmt.Errorf("failed to set value in cache") } diff --git a/config/viper.go b/config/viper.go index f0ce3f7..bf74f2a 100644 --- a/config/viper.go +++ b/config/viper.go @@ -15,12 +15,13 @@ import ( ) type Config struct { - Lang string `toml:"lang" mapstructure:"lang" json:"lang"` - Workers int `toml:"workers" mapstructure:"workers"` - Retry int `toml:"retry" mapstructure:"retry"` - NoCleanCache bool `toml:"no_clean_cache" mapstructure:"no_clean_cache" json:"no_clean_cache"` - Threads int `toml:"threads" mapstructure:"threads" json:"threads"` - Stream bool `toml:"stream" mapstructure:"stream" json:"stream"` + Lang string `toml:"lang" mapstructure:"lang" json:"lang"` + Workers int `toml:"workers" mapstructure:"workers"` + Retry int `toml:"retry" mapstructure:"retry"` + NoCleanCache bool `toml:"no_clean_cache" mapstructure:"no_clean_cache" json:"no_clean_cache"` + Threads int `toml:"threads" mapstructure:"threads" json:"threads"` + Stream bool `toml:"stream" mapstructure:"stream" json:"stream"` + Cache cacheConfig `toml:"cache" mapstructure:"cache" json:"cache"` Users []userConfig `toml:"users" mapstructure:"users" json:"users"` @@ -30,6 +31,12 @@ type Config struct { Storages []storage.StorageConfig `toml:"-" mapstructure:"-" json:"storages"` } +type cacheConfig struct { + TTL int64 `toml:"ttl" mapstructure:"ttl" json:"ttl"` + NumCounters int64 `toml:"num_counters" mapstructure:"num_counters" json:"num_counters"` + MaxCost int64 `toml:"max_cost" mapstructure:"max_cost" json:"max_cost"` +} + type tempConfig struct { BasePath string `toml:"base_path" mapstructure:"base_path" json:"base_path"` CacheTTL int64 `toml:"cache_ttl" mapstructure:"cache_ttl" json:"cache_ttl"` @@ -87,6 +94,10 @@ func Init(ctx context.Context) error { viper.SetDefault("retry", 3) viper.SetDefault("threads", 4) + viper.SetDefault("cache.ttl", 86400) + viper.SetDefault("cache.num_counters", 1e5) + viper.SetDefault("cache.max_cost", 1e6) + viper.SetDefault("telegram.app_id", 1025907) viper.SetDefault("telegram.app_hash", "452b0359b988148995f22ff0f4229750") viper.SetDefault("telegram.timeout", 60)