Skip to content

Commit

Permalink
CacheManager
Browse files Browse the repository at this point in the history
  • Loading branch information
wubin1989 committed Dec 11, 2023
1 parent 9faf4b3 commit c7d2c02
Show file tree
Hide file tree
Showing 5 changed files with 251 additions and 112 deletions.
144 changes: 144 additions & 0 deletions framework/cache/cachemanager.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package cache

import (
"strings"
"time"
"unsafe"

"github.com/dgraph-io/ristretto"
gocache "github.com/eko/gocache/lib/v4/cache"
"github.com/eko/gocache/lib/v4/metrics"
"github.com/eko/gocache/lib/v4/store"
redis_store "github.com/eko/gocache/store/redis/v4"
ristretto_store "github.com/eko/gocache/store/ristretto/v4"
"github.com/redis/go-redis/v9"

"github.com/unionj-cloud/go-doudou/v2/framework/config"
"github.com/unionj-cloud/go-doudou/v2/toolkit/cast"
"github.com/unionj-cloud/go-doudou/v2/toolkit/sliceutils"
"github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils"
)

var CacheManager gocache.CacheInterface[any]

const (
CacheStoreRistretto = "ristretto"
CacheStoreRedis = "redis"
)

func init() {
conf := config.Config{
Cache: struct {
TTL int
Stores string
Redis struct {
Addr string
RouteByLatency bool "default:\"true\""
RouteRandomly bool
}
Ristretto struct {
NumCounters int64 "default:\"1000\""
MaxCost int64 "default:\"100\""
BufferItems int64 "default:\"64\""
}
}{
TTL: cast.ToIntOrDefault(config.GddCacheTTL.Load(), config.DefaultGddCacheTTL),
Stores: config.GddCacheStores.LoadOrDefault(config.DefaultGddCacheStores),
Ristretto: struct {
NumCounters int64 "default:\"1000\""
MaxCost int64 "default:\"100\""
BufferItems int64 "default:\"64\""
}{
NumCounters: cast.ToInt64OrDefault(config.GddCacheRistrettoNumCounters.Load(), config.DefaultGddCacheRistrettoNumCounters),
MaxCost: cast.ToInt64OrDefault(config.GddCacheRistrettoMaxCost.Load(), config.DefaultGddCacheRistrettoMaxCost),
BufferItems: cast.ToInt64OrDefault(config.GddCacheRistrettoBufferItems.Load(), config.DefaultGddCacheRistrettoBufferItems),
},
Redis: struct {
Addr string
RouteByLatency bool "default:\"true\""
RouteRandomly bool
}{
Addr: config.GddCacheRedisAddr.LoadOrDefault(config.DefaultGddCacheRedisAddr),
RouteByLatency: cast.ToBoolOrDefault(config.GddCacheRedisRouteByLatency.Load(), config.DefaultGddCacheRedisRouteByLatency),
RouteRandomly: cast.ToBoolOrDefault(config.GddCacheRedisRouteRandomly.Load(), config.DefaultGddCacheRedisRouteRandomly),
},
},
Service: struct{ Name string }{
Name: config.GddServiceName.LoadOrDefault(config.DefaultGddServiceName),
},
}

CacheManager = NewCacheManager(conf)
}

func NewCacheManager(conf config.Config) gocache.CacheInterface[any] {
storesStr := conf.Cache.Stores
if stringutils.IsEmpty(storesStr) {
return nil
}
stores := strings.Split(storesStr, ",")

var setterCaches []gocache.SetterCacheInterface[any]
ttl := conf.Cache.TTL

if sliceutils.StringContains(stores, CacheStoreRistretto) {
ristrettoCache, err := ristretto.NewCache(&ristretto.Config{
NumCounters: conf.Cache.Ristretto.NumCounters,
MaxCost: conf.Cache.Ristretto.MaxCost,
BufferItems: conf.Cache.Ristretto.BufferItems,
Cost: func(value interface{}) int64 {
return int64(unsafe.Sizeof(value))
},
})
if err != nil {
panic(err)
}
var ristrettoStore *ristretto_store.RistrettoStore
if ttl > 0 {
ristrettoStore = ristretto_store.NewRistretto(ristrettoCache, store.WithExpiration(time.Duration(ttl)*time.Second))
} else {
ristrettoStore = ristretto_store.NewRistretto(ristrettoCache)
}
setterCaches = append(setterCaches, gocache.New[any](ristrettoStore))
}

if sliceutils.StringContains(stores, CacheStoreRedis) {
redisAddr := conf.Cache.Redis.Addr
if stringutils.IsNotEmpty(redisAddr) {
addrs := strings.Split(redisAddr, ",")
var redisClient redis_store.RedisClientInterface
if len(addrs) > 1 {
redisClient = redis.NewClusterClient(&redis.ClusterOptions{
Addrs: addrs,
RouteByLatency: conf.Cache.Redis.RouteByLatency,
RouteRandomly: conf.Cache.Redis.RouteRandomly,
})
} else {
redisClient = redis.NewClient(&redis.Options{Addr: addrs[0]})
}
var redisStore *redis_store.RedisStore
if ttl > 0 {
redisStore = redis_store.NewRedis(redisClient, store.WithExpiration(time.Duration(ttl)*time.Second))
} else {
redisStore = redis_store.NewRedis(redisClient)
}
setterCaches = append(setterCaches, gocache.New[any](redisStore))
}
}

var cacheManager gocache.CacheInterface[any]

// Initialize chained cache
cacheManager = gocache.NewChain[any](setterCaches...)

serviceName := conf.Service.Name
if stringutils.IsNotEmpty(serviceName) {
// Initializes Prometheus metrics service
promMetrics := metrics.NewPrometheus(serviceName)

// Initialize chained cache
cacheManager = gocache.NewMetric[any](promMetrics, cacheManager)
}

return cacheManager
}
60 changes: 44 additions & 16 deletions framework/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,29 @@ package config

import (
"fmt"
"net"
"net/url"
"os"
"strconv"
"strings"
"sync"

"github.com/apolloconfig/agollo/v4"
"github.com/apolloconfig/agollo/v4/env/config"
"github.com/pkg/errors"
"github.com/rs/zerolog"
"github.com/sirupsen/logrus"
"github.com/wubin1989/nacos-sdk-go/v2/common/constant"
"github.com/wubin1989/nacos-sdk-go/v2/vo"
_ "go.uber.org/automaxprocs"

"github.com/unionj-cloud/go-doudou/v2/framework"
"github.com/unionj-cloud/go-doudou/v2/framework/configmgr"
"github.com/unionj-cloud/go-doudou/v2/toolkit/cast"
"github.com/unionj-cloud/go-doudou/v2/toolkit/dotenv"
"github.com/unionj-cloud/go-doudou/v2/toolkit/stringutils"
"github.com/unionj-cloud/go-doudou/v2/toolkit/yaml"
"github.com/unionj-cloud/go-doudou/v2/toolkit/zlogger"
"github.com/wubin1989/nacos-sdk-go/v2/common/constant"
"github.com/wubin1989/nacos-sdk-go/v2/vo"
_ "go.uber.org/automaxprocs"
"net"
"net/url"
"os"
"strconv"
"strings"
"sync"
)

func LoadConfigFromLocal() {
Expand Down Expand Up @@ -281,19 +283,20 @@ const (
GddDBPostgresWithoutReturning envVariable = "GDD_DB_POSTGRES_WITHOUTRETURNING"

GddDbPrometheusEnable envVariable = "GDD_DB_PROMETHEUS_ENABLE"
GddDbPrometheusRefreshInterval envVariable = "GDD_DB_PROMETHEUS_REFRESH_INTERVAL"
GddDbPrometheusDBName envVariable = "GDD_DB_PROMETHEUS_DB_NAME"
GddDbPrometheusRefreshInterval envVariable = "GDD_DB_PROMETHEUS_REFRESHINTERVAL"
GddDbPrometheusDBName envVariable = "GDD_DB_PROMETHEUS_DBNAME"

GddDbCacheEnable envVariable = "GDD_DB_CACHE_ENABLE"
GddCacheTTL envVariable = "GDD_CACHE_TTL"
GddCacheStores envVariable = "GDD_CACHE_STORES"

GddCacheRedisAddr envVariable = "GDD_CACHE_REDIS_ADDR"
GddCacheRedisRouteByLatency envVariable = "GDD_CACHE_REDIS_ROUTE_BY_LATENCY"
GddCacheRedisRouteRandomly envVariable = "GDD_CACHE_REDIS_ROUTE_RANDOMLY"
GddCacheRedisTTL envVariable = "GDD_CACHE_REDIS_TTL"
GddCacheRedisRouteByLatency envVariable = "GDD_CACHE_REDIS_ROUTEBYLATENCY"
GddCacheRedisRouteRandomly envVariable = "GDD_CACHE_REDIS_ROUTERANDOMLY"

GddCacheRistrettoNumCounters envVariable = "GDD_CACHE_RISTRETTO_NUMCOUNTERS"
GddCacheRistrettoMaxCost envVariable = "GDD_CACHE_RISTRETTO_MAX_COST"
GddCacheRistrettoBufferItems envVariable = "GDD_CACHE_RISTRETTO_BUFFER_ITEMS"
GddCacheRistrettoMaxCost envVariable = "GDD_CACHE_RISTRETTO_MAXCOST"
GddCacheRistrettoBufferItems envVariable = "GDD_CACHE_RISTRETTO_BUFFERITEMS"

GddZkServers envVariable = "GDD_ZK_SERVERS"
GddZkSequence envVariable = "GDD_ZK_SEQUENCE"
Expand Down Expand Up @@ -471,5 +474,30 @@ type Config struct {
ConnMaxLifetime string
ConnMaxIdleTime string
}
Cache struct {
Enable bool
}
Prometheus struct {
Enable bool
RefreshInterval int `default:"15"`
DBName string
}
}
Cache struct {
TTL int
Stores string
Redis struct {
Addr string
RouteByLatency bool `default:"true"`
RouteRandomly bool
}
Ristretto struct {
NumCounters int64 `default:"1000"`
MaxCost int64 `default:"100"`
BufferItems int64 `default:"64"`
}
}
Service struct {
Name string
}
}
6 changes: 4 additions & 2 deletions framework/config/default.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package config

import (
"github.com/unionj-cloud/go-doudou/v2/framework/configmgr"
"gorm.io/gorm/logger"

"github.com/unionj-cloud/go-doudou/v2/framework/configmgr"
)

const FrameworkName = "go-doudou"
Expand Down Expand Up @@ -137,7 +138,8 @@ const (
DefaultGddCacheRedisAddr = ""
DefaultGddCacheRedisRouteByLatency = true
DefaultGddCacheRedisRouteRandomly = false
DefaultGddCacheRedisTTL = 0
DefaultGddCacheTTL = 0
DefaultGddCacheStores = ""

DefaultGddCacheRistrettoNumCounters = 1000
DefaultGddCacheRistrettoMaxCost = 100
Expand Down
Loading

0 comments on commit c7d2c02

Please sign in to comment.