作者 yangfu

add cache

@@ -11,9 +11,7 @@ require ( @@ -11,9 +11,7 @@ require (
11 github.com/gavv/httpexpect v2.0.0+incompatible 11 github.com/gavv/httpexpect v2.0.0+incompatible
12 github.com/go-pg/pg/v10 v10.9.0 12 github.com/go-pg/pg/v10 v10.9.0
13 github.com/google/go-querystring v1.1.0 // indirect 13 github.com/google/go-querystring v1.1.0 // indirect
14 - github.com/gorilla/websocket v1.4.2 // indirect  
15 github.com/imkira/go-interpol v1.1.0 // indirect 14 github.com/imkira/go-interpol v1.1.0 // indirect
16 - github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect  
17 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7 15 github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
18 github.com/mattn/go-colorable v0.1.8 // indirect 16 github.com/mattn/go-colorable v0.1.8 // indirect
19 github.com/moul/http2curl v1.0.0 // indirect 17 github.com/moul/http2curl v1.0.0 // indirect
@@ -21,6 +19,7 @@ require ( @@ -21,6 +19,7 @@ require (
21 github.com/onsi/gomega v1.11.0 19 github.com/onsi/gomega v1.11.0
22 github.com/sergi/go-diff v1.2.0 // indirect 20 github.com/sergi/go-diff v1.2.0 // indirect
23 github.com/smartystreets/goconvey v1.6.4 // indirect 21 github.com/smartystreets/goconvey v1.6.4 // indirect
  22 + github.com/tiptok/gocomm v1.0.12
24 github.com/valyala/fasthttp v1.23.0 // indirect 23 github.com/valyala/fasthttp v1.23.0 // indirect
25 github.com/xeipuuv/gojsonschema v1.2.0 // indirect 24 github.com/xeipuuv/gojsonschema v1.2.0 // indirect
26 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect 25 github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
此 diff 太大无法显示。
@@ -3,6 +3,7 @@ package main @@ -3,6 +3,7 @@ package main
3 import ( 3 import (
4 "github.com/beego/beego/v2/server/web" 4 "github.com/beego/beego/v2/server/web"
5 _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg" 5 _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
  6 + _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/redis"
6 _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego" 7 _ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego"
7 ) 8 )
8 9
  1 +package constant
  2 +
  3 +import "os"
  4 +
  5 +var REDIS_HOST = "127.0.0.1"
  6 +var REDIS_PORT = "6379"
  7 +var REDIS_AUTH = ""
  8 +
  9 +func init() {
  10 + if os.Getenv("REDIS_HOST") != "" {
  11 + REDIS_HOST = os.Getenv("REDIS_HOST")
  12 + REDIS_AUTH = os.Getenv("REDIS_AUTH")
  13 + }
  14 + if os.Getenv("REDIS_PORT") != "" {
  15 + REDIS_PORT = os.Getenv("REDIS_PORT")
  16 + }
  17 + if _, ok := os.LookupEnv("REDIS_AUTH"); ok {
  18 + REDIS_AUTH = os.Getenv("REDIS_AUTH")
  19 + }
  20 +}
@@ -2,6 +2,7 @@ package domain @@ -2,6 +2,7 @@ package domain
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
  5 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
5 "time" 6 "time"
6 ) 7 )
7 8
@@ -149,3 +150,10 @@ func CheckPartnerUserType(dm *User) (*User, error) { @@ -149,3 +150,10 @@ func CheckPartnerUserType(dm *User) (*User, error) {
149 } 150 }
150 return dm, nil 151 return dm, nil
151 } 152 }
  153 +
  154 +func (m *User) CacheKeyFunc() string {
  155 + if m.UserId == 0 {
  156 + return ""
  157 + }
  158 + return fmt.Sprintf("%v:cache:Users:id:%v", constant.POSTGRESQL_DB_NAME, m.UserId)
  159 +}
  1 +package redis
  2 +
  3 +import (
  4 + "github.com/tiptok/gocomm/pkg/cache"
  5 + "github.com/tiptok/gocomm/pkg/cache/gzcache"
  6 + "github.com/tiptok/gocomm/pkg/log"
  7 + "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
  8 +)
  9 +
  10 +func init() {
  11 + //redisSource := fmt.Sprintf("%v:%v", constant.REDIS_HOST, constant.REDIS_PORT)
  12 + //err := redis.InitWithDb(100, redisSource, constant.REDIS_AUTH, "0")
  13 + //if err != nil {
  14 + // log.Error(err)
  15 + //}
  16 + //cache.InitDefault(cache.WithDefaultRedisPool(redis.GetRedisPool()))
  17 + cache.InitMultiLevelCache(cache.WithDebugLog(true, log.Logger))
  18 + cache.RegisterCache(gzcache.NewNodeCache(constant.REDIS_HOST+":"+constant.REDIS_PORT, constant.REDIS_AUTH))
  19 +}
@@ -3,6 +3,7 @@ package repository @@ -3,6 +3,7 @@ package repository
3 import ( 3 import (
4 "fmt" 4 "fmt"
5 "github.com/go-pg/pg/v10" 5 "github.com/go-pg/pg/v10"
  6 + "github.com/tiptok/gocomm/pkg/cache"
6 7
7 "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder" 8 "github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
8 pgTransaction "github.com/linmadan/egglib-go/transaction/pg" 9 pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
@@ -13,6 +14,7 @@ import ( @@ -13,6 +14,7 @@ import (
13 ) 14 )
14 15
15 type UserRepository struct { 16 type UserRepository struct {
  17 + *cache.CachedRepository
16 transactionContext *pgTransaction.TransactionContext 18 transactionContext *pgTransaction.TransactionContext
17 } 19 }
18 20
@@ -38,7 +40,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error) @@ -38,7 +40,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
38 "access_partners", 40 "access_partners",
39 "create_at", 41 "create_at",
40 "update_at", 42 "update_at",
41 - "delete_at", 43 + //"delete_at",
42 } 44 }
43 insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields) 45 insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
44 insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields) 46 insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
@@ -87,35 +89,41 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error) @@ -87,35 +89,41 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
87 return user, err 89 return user, err
88 } 90 }
89 } else { 91 } else {
90 - if _, err := tx.QueryOne(  
91 - pg.Scan(  
92 - &user.UserId,  
93 - &user.UserType,  
94 - pg.Array(&user.Permissions),  
95 - &user.CompanyId,  
96 - &user.UserAccount,  
97 - &user.UserInfo,  
98 - &user.PartnerInfo,  
99 - &user.Status,  
100 - &user.AdminType,  
101 - pg.Array(&user.AccessPartners),  
102 - &user.CreateAt,  
103 - &user.UpdateAt,  
104 - &user.DeleteAt,  
105 - ),  
106 - fmt.Sprintf("UPDATE users SET %s WHERE user_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),  
107 - user.UserType,  
108 - pg.Array(user.Permissions),  
109 - user.CompanyId,  
110 - user.UserAccount,  
111 - user.UserInfo,  
112 - user.PartnerInfo,  
113 - user.Status,  
114 - user.AdminType,  
115 - pg.Array(user.AccessPartners),  
116 - user.UpdateAt,  
117 - user.Identify(),  
118 - ); err != nil { 92 + queryFunc := func() (interface{}, error) {
  93 + if _, err := tx.QueryOne(
  94 + pg.Scan(
  95 + &user.UserId,
  96 + &user.UserType,
  97 + pg.Array(&user.Permissions),
  98 + &user.CompanyId,
  99 + &user.UserAccount,
  100 + &user.UserInfo,
  101 + &user.PartnerInfo,
  102 + &user.Status,
  103 + &user.AdminType,
  104 + pg.Array(&user.AccessPartners),
  105 + &user.CreateAt,
  106 + &user.UpdateAt,
  107 + &user.DeleteAt,
  108 + ),
  109 + fmt.Sprintf("UPDATE users SET %s WHERE user_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
  110 + user.UserType,
  111 + pg.Array(user.Permissions),
  112 + user.CompanyId,
  113 + user.UserAccount,
  114 + user.UserInfo,
  115 + user.PartnerInfo,
  116 + user.Status,
  117 + user.AdminType,
  118 + pg.Array(user.AccessPartners),
  119 + user.UpdateAt,
  120 + user.Identify(),
  121 + ); err != nil {
  122 + return user, err
  123 + }
  124 + return user, nil
  125 + }
  126 + if _, err := repository.Query(queryFunc, user.CacheKeyFunc()); err != nil {
119 return user, err 127 return user, err
120 } 128 }
121 } 129 }
@@ -125,7 +133,10 @@ func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error @@ -125,7 +133,10 @@ func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error
125 tx := repository.transactionContext.PgTx 133 tx := repository.transactionContext.PgTx
126 userModel := new(models.User) 134 userModel := new(models.User)
127 userModel.UserId = user.Identify().(int64) 135 userModel.UserId = user.Identify().(int64)
128 - if _, err := tx.Model(userModel).WherePK().Delete(); err != nil { 136 + queryFunc := func() (interface{}, error) {
  137 + return tx.Model(userModel).WherePK().Delete()
  138 + }
  139 + if _, err := repository.Query(queryFunc, user.CacheKeyFunc()); err != nil {
129 return user, err 140 return user, err
130 } 141 }
131 return user, nil 142 return user, nil
@@ -133,19 +144,29 @@ func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error @@ -133,19 +144,29 @@ func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error
133 func (repository *UserRepository) FindOne(queryOptions map[string]interface{}) (*domain.User, error) { 144 func (repository *UserRepository) FindOne(queryOptions map[string]interface{}) (*domain.User, error) {
134 tx := repository.transactionContext.PgTx 145 tx := repository.transactionContext.PgTx
135 userModel := new(models.User) 146 userModel := new(models.User)
136 - query := sqlbuilder.BuildQuery(tx.Model(userModel), queryOptions)  
137 - query.SetWhereByQueryOption("users.user_id = ?", "userId")  
138 - query.SetWhereByQueryOption("users.status = ?", "status")  
139 - query.SetWhereByQueryOption("users.user_type = ?", "userType")  
140 - if v, ok := queryOptions["inUserIds"]; ok {  
141 - query.Where("users.user_id in (?)", pg.Array(v))  
142 - }  
143 - if err := query.First(); err != nil {  
144 - if err.Error() == "pg: no rows in result set" {  
145 - return nil, fmt.Errorf("没有此资源")  
146 - } else {  
147 - return nil, err 147 + queryFunc := func() (interface{}, error) {
  148 + query := sqlbuilder.BuildQuery(tx.Model(userModel), queryOptions)
  149 + query.SetWhereByQueryOption("users.user_id = ?", "userId")
  150 + query.SetWhereByQueryOption("users.status = ?", "status")
  151 + query.SetWhereByQueryOption("users.user_type = ?", "userType")
  152 + if v, ok := queryOptions["inUserIds"]; ok {
  153 + query.Where("users.user_id in (?)", pg.Array(v))
148 } 154 }
  155 + if err := query.First(); err != nil {
  156 + if err.Error() == "pg: no rows in result set" {
  157 + return nil, fmt.Errorf("没有此资源")
  158 + } else {
  159 + return nil, err
  160 + }
  161 + }
  162 + return userModel, nil
  163 + }
  164 + var cacheModel = &domain.User{}
  165 + if _, ok := queryOptions["userId"]; ok {
  166 + cacheModel.UserId = queryOptions["userId"].(int64)
  167 + }
  168 + if err := repository.QueryCache(cacheModel.CacheKeyFunc, userModel, queryFunc); err != nil {
  169 + return nil, err
149 } 170 }
150 if userModel.UserId == 0 { 171 if userModel.UserId == 0 {
151 return nil, nil 172 return nil, nil
@@ -179,6 +200,7 @@ func NewUserRepository(transactionContext *pgTransaction.TransactionContext) (*U @@ -179,6 +200,7 @@ func NewUserRepository(transactionContext *pgTransaction.TransactionContext) (*U
179 } else { 200 } else {
180 return &UserRepository{ 201 return &UserRepository{
181 transactionContext: transactionContext, 202 transactionContext: transactionContext,
  203 + CachedRepository: cache.NewDefaultCachedRepository(),
182 }, nil 204 }, nil
183 } 205 }
184 } 206 }