From 62bf69362707891a04ee1886b55ef5a2d5433694 Mon Sep 17 00:00:00 2001 From: Ernest Litvinenko Date: Thu, 21 Mar 2024 23:44:50 +0300 Subject: [PATCH] make some changes --- go.mod | 5 +++++ go.sum | 10 ++++++++++ handlers/catalog/routes.go | 15 ++++++++++----- internal/redis.go | 17 +++++++++++++++-- main.go | 1 + services/catalog.go | 4 ++-- 6 files changed, 43 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 45928eb..cf914c4 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,14 @@ module relynolli-server go 1.21 require ( + github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d // indirect github.com/bytedance/sonic v1.11.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect github.com/chenzhuoyu/iasm v0.9.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/gabriel-vasile/mimetype v1.4.3 // indirect + github.com/gin-contrib/cache v1.2.0 // indirect github.com/gin-contrib/cors v1.5.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/gin-gonic/gin v1.9.1 // indirect @@ -17,6 +19,7 @@ require ( github.com/go-playground/validator/v10 v10.19.0 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect github.com/goccy/go-json v0.10.2 // indirect + github.com/gomodule/redigo v1.8.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect github.com/joho/godotenv v1.5.1 // indirect @@ -24,11 +27,13 @@ require ( github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/leodido/go-urn v1.4.0 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/memcachier/mc/v3 v3.0.3 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/redis/go-redis/v9 v9.5.1 // indirect + github.com/robfig/go-cache v0.0.0-20130306151617-9fc39e0dbf62 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect github.com/ugorji/go/codec v1.2.12 // indirect diff --git a/go.sum b/go.sum index 1292dd5..33f3489 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,5 @@ +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d h1:pVrfxiGfwelyab6n21ZBkbkmbevaf+WvMIiR7sr97hw= +github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA= github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= github.com/bytedance/sonic v1.11.1 h1:JC0+6c9FoWYYxakaoa+c5QTtJeiSZNeByOBhXtAFSn4= @@ -17,6 +19,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0= github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk= +github.com/gin-contrib/cache v1.2.0 h1:WA+AJR4kmHDTaLLShCHo/IeWVmmGRZ3Lsr3JQ46tFlE= +github.com/gin-contrib/cache v1.2.0/go.mod h1:2KkFL8PSnPF3Tt5E2Jpc3HWuBAUKqGZnClCFMm0tXQI= github.com/gin-contrib/cors v1.5.0 h1:DgGKV7DDoOn36DFkNtbHrjoRiT5ExCe+PC9/xp7aKvk= github.com/gin-contrib/cors v1.5.0/go.mod h1:TvU7MAZ3EwrPLI2ztzTt3tqgvBCq+wn8WpZmfADjupI= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= @@ -37,6 +41,8 @@ github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9 github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= +github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -57,6 +63,8 @@ github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= +github.com/memcachier/mc/v3 v3.0.3 h1:qii+lDiPKi36O4Xg+HVKwHu6Oq+Gt17b+uEiA0Drwv4= +github.com/memcachier/mc/v3 v3.0.3/go.mod h1:GzjocBahcXPxt2cmqzknrgqCOmMxiSzhVKPOe90Tpug= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -69,6 +77,8 @@ github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdU github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/redis/go-redis/v9 v9.5.1 h1:H1X4D3yHPaYrkL5X06Wh6xNVM/pX0Ft4RV0vMGvLBh8= github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M= +github.com/robfig/go-cache v0.0.0-20130306151617-9fc39e0dbf62 h1:pyecQtsPmlkCsMkYhT5iZ+sUXuwee+OvfuJjinEA3ko= +github.com/robfig/go-cache v0.0.0-20130306151617-9fc39e0dbf62/go.mod h1:65XQgovT59RWatovFwnwocoUxiI/eENTnOY5GK3STuY= github.com/rvinnie/yookassa-sdk-go v0.0.0-20230904104101-ff7e5be5530c h1:m6dxe045lJQ1tkJeCBwseulCwppUDcdZk+RIxzBjQXQ= github.com/rvinnie/yookassa-sdk-go v0.0.0-20230904104101-ff7e5be5530c/go.mod h1:flatybkcu+7YLaB7mMnj9JTNKeim4jZ+ZrXNFjVA0pA= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= diff --git a/handlers/catalog/routes.go b/handlers/catalog/routes.go index e58559c..1623ed7 100644 --- a/handlers/catalog/routes.go +++ b/handlers/catalog/routes.go @@ -1,15 +1,20 @@ package catalog import ( - "github.com/gin-gonic/gin" "relynolli-server/handlers/catalog/endpoints" + "relynolli-server/internal" + "time" + + "github.com/gin-contrib/cache" + "github.com/gin-gonic/gin" ) func HandleRoutes(parent *gin.RouterGroup) { h := endpoints.GetHandlers() + cacheStore := internal.InitCacheStore() catalog := parent.Group("/catalog") - catalog.GET("/filters", h.GetFilters) - catalog.GET("/count", h.Count) - catalog.GET("", h.GetCatalogItems) - catalog.GET("/:code", h.GetCatalogItem) + catalog.GET("/filters", cache.CachePage(cacheStore, 15, h.GetFilters)) + catalog.GET("/count", cache.CachePage(cacheStore, 15 * time.Minute, h.Count)) + catalog.GET("", cache.CachePage(cacheStore, 15 * time.Minute, h.GetCatalogItems)) + catalog.GET("/:code", cache.CachePage(cacheStore, 15 * time.Minute, h.GetCatalogItem)) } diff --git a/internal/redis.go b/internal/redis.go index d08cab2..2884ab8 100644 --- a/internal/redis.go +++ b/internal/redis.go @@ -2,26 +2,32 @@ package internal import ( "context" - "github.com/redis/go-redis/v9" "log" "os" "strconv" + "time" + + "github.com/gin-contrib/cache/persistence" + "github.com/redis/go-redis/v9" ) var ( redisInstance *redis.Client = nil + cacheStore *persistence.RedisStore ) type Cache interface { } -func InitRedis() *redis.Client { +func InitRedis() (*redis.Client) { + if redisInstance == nil { redis_db_num, err := strconv.Atoi(os.Getenv("REDIS_DATABASE")) if err != nil { log.Fatalln("REDIS_DATABASE should be integer") } redisInstance = redis.NewClient(&redis.Options{Addr: os.Getenv("REDIS_ADDRESS"), Password: os.Getenv("REDIS_PASSWORD"), DB: redis_db_num}) + _, conError := redisInstance.Ping(context.Background()).Result() if conError != nil { log.Fatalln("Cannot connect to redis host") @@ -29,3 +35,10 @@ func InitRedis() *redis.Client { } return redisInstance } + +func InitCacheStore() *persistence.RedisStore{ + if cacheStore == nil { + cacheStore = persistence.NewRedisCache(os.Getenv("REDIS_ADDRESS"), os.Getenv("REDIS_PASSWORD"), 15 * time.Minute) + } + return cacheStore +} diff --git a/main.go b/main.go index 88b5c71..447076f 100644 --- a/main.go +++ b/main.go @@ -26,6 +26,7 @@ func main() { db := internal.InitDatabase() rdb := internal.InitRedis() + handlers.InitializeRouter(server) defer db.Close() defer rdb.Close() diff --git a/services/catalog.go b/services/catalog.go index d079c9f..6f1522e 100644 --- a/services/catalog.go +++ b/services/catalog.go @@ -84,7 +84,7 @@ func FilterCatalogItems(filters map[string][]string, limit int, offset int) []mo if key == "limit" { continue } - if key == "offset" { + if key == "page" { continue } @@ -104,5 +104,5 @@ func FilterCatalogItems(filters map[string][]string, limit int, offset int) []mo stmt = fmt.Sprintf(stmt, strings.Join(samples, " and ")) print("\n" + stmt + "\n") - return retrieveCatalogItems(stmt + fmt.Sprintf("and is_active = 1 and available_quantity > 0 limit %d offset %d", limit, offset)) + return retrieveCatalogItems(stmt + fmt.Sprintf("and is_active = 1 and available_quantity > 0;")) }