作者 yangfu

add cache

... ... @@ -11,9 +11,7 @@ require (
github.com/gavv/httpexpect v2.0.0+incompatible
github.com/go-pg/pg/v10 v10.9.0
github.com/google/go-querystring v1.1.0 // indirect
github.com/gorilla/websocket v1.4.2 // indirect
github.com/imkira/go-interpol v1.1.0 // indirect
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
github.com/linmadan/egglib-go v0.0.0-20210313060205-8b5e456b11f7
github.com/mattn/go-colorable v0.1.8 // indirect
github.com/moul/http2curl v1.0.0 // indirect
... ... @@ -21,6 +19,7 @@ require (
github.com/onsi/gomega v1.11.0
github.com/sergi/go-diff v1.2.0 // indirect
github.com/smartystreets/goconvey v1.6.4 // indirect
github.com/tiptok/gocomm v1.0.12
github.com/valyala/fasthttp v1.23.0 // indirect
github.com/xeipuuv/gojsonschema v1.2.0 // indirect
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 // indirect
... ...
此 diff 太大无法显示。
... ... @@ -3,6 +3,7 @@ package main
import (
"github.com/beego/beego/v2/server/web"
_ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/pg"
_ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/infrastructure/redis"
_ "gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/port/beego"
)
... ...
package constant
import "os"
var REDIS_HOST = "127.0.0.1"
var REDIS_PORT = "6379"
var REDIS_AUTH = ""
func init() {
if os.Getenv("REDIS_HOST") != "" {
REDIS_HOST = os.Getenv("REDIS_HOST")
REDIS_AUTH = os.Getenv("REDIS_AUTH")
}
if os.Getenv("REDIS_PORT") != "" {
REDIS_PORT = os.Getenv("REDIS_PORT")
}
if _, ok := os.LookupEnv("REDIS_AUTH"); ok {
REDIS_AUTH = os.Getenv("REDIS_AUTH")
}
}
... ...
... ... @@ -2,6 +2,7 @@ package domain
import (
"fmt"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
"time"
)
... ... @@ -149,3 +150,10 @@ func CheckPartnerUserType(dm *User) (*User, error) {
}
return dm, nil
}
func (m *User) CacheKeyFunc() string {
if m.UserId == 0 {
return ""
}
return fmt.Sprintf("%v:cache:Users:id:%v", constant.POSTGRESQL_DB_NAME, m.UserId)
}
... ...
package redis
import (
"github.com/tiptok/gocomm/pkg/cache"
"github.com/tiptok/gocomm/pkg/cache/gzcache"
"github.com/tiptok/gocomm/pkg/log"
"gitlab.fjmaimaimai.com/mmm-go-pp/partner01/pkg/constant"
)
func init() {
//redisSource := fmt.Sprintf("%v:%v", constant.REDIS_HOST, constant.REDIS_PORT)
//err := redis.InitWithDb(100, redisSource, constant.REDIS_AUTH, "0")
//if err != nil {
// log.Error(err)
//}
//cache.InitDefault(cache.WithDefaultRedisPool(redis.GetRedisPool()))
cache.InitMultiLevelCache(cache.WithDebugLog(true, log.Logger))
cache.RegisterCache(gzcache.NewNodeCache(constant.REDIS_HOST+":"+constant.REDIS_PORT, constant.REDIS_AUTH))
}
... ...
... ... @@ -3,6 +3,7 @@ package repository
import (
"fmt"
"github.com/go-pg/pg/v10"
"github.com/tiptok/gocomm/pkg/cache"
"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
... ... @@ -13,6 +14,7 @@ import (
)
type UserRepository struct {
*cache.CachedRepository
transactionContext *pgTransaction.TransactionContext
}
... ... @@ -38,7 +40,7 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
"access_partners",
"create_at",
"update_at",
"delete_at",
//"delete_at",
}
insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
... ... @@ -87,35 +89,41 @@ func (repository *UserRepository) Save(user *domain.User) (*domain.User, error)
return user, err
}
} else {
if _, err := tx.QueryOne(
pg.Scan(
&user.UserId,
&user.UserType,
pg.Array(&user.Permissions),
&user.CompanyId,
&user.UserAccount,
&user.UserInfo,
&user.PartnerInfo,
&user.Status,
&user.AdminType,
pg.Array(&user.AccessPartners),
&user.CreateAt,
&user.UpdateAt,
&user.DeleteAt,
),
fmt.Sprintf("UPDATE users SET %s WHERE user_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
user.UserType,
pg.Array(user.Permissions),
user.CompanyId,
user.UserAccount,
user.UserInfo,
user.PartnerInfo,
user.Status,
user.AdminType,
pg.Array(user.AccessPartners),
user.UpdateAt,
user.Identify(),
); err != nil {
queryFunc := func() (interface{}, error) {
if _, err := tx.QueryOne(
pg.Scan(
&user.UserId,
&user.UserType,
pg.Array(&user.Permissions),
&user.CompanyId,
&user.UserAccount,
&user.UserInfo,
&user.PartnerInfo,
&user.Status,
&user.AdminType,
pg.Array(&user.AccessPartners),
&user.CreateAt,
&user.UpdateAt,
&user.DeleteAt,
),
fmt.Sprintf("UPDATE users SET %s WHERE user_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
user.UserType,
pg.Array(user.Permissions),
user.CompanyId,
user.UserAccount,
user.UserInfo,
user.PartnerInfo,
user.Status,
user.AdminType,
pg.Array(user.AccessPartners),
user.UpdateAt,
user.Identify(),
); err != nil {
return user, err
}
return user, nil
}
if _, err := repository.Query(queryFunc, user.CacheKeyFunc()); err != nil {
return user, err
}
}
... ... @@ -125,7 +133,10 @@ func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error
tx := repository.transactionContext.PgTx
userModel := new(models.User)
userModel.UserId = user.Identify().(int64)
if _, err := tx.Model(userModel).WherePK().Delete(); err != nil {
queryFunc := func() (interface{}, error) {
return tx.Model(userModel).WherePK().Delete()
}
if _, err := repository.Query(queryFunc, user.CacheKeyFunc()); err != nil {
return user, err
}
return user, nil
... ... @@ -133,19 +144,29 @@ func (repository *UserRepository) Remove(user *domain.User) (*domain.User, error
func (repository *UserRepository) FindOne(queryOptions map[string]interface{}) (*domain.User, error) {
tx := repository.transactionContext.PgTx
userModel := new(models.User)
query := sqlbuilder.BuildQuery(tx.Model(userModel), queryOptions)
query.SetWhereByQueryOption("users.user_id = ?", "userId")
query.SetWhereByQueryOption("users.status = ?", "status")
query.SetWhereByQueryOption("users.user_type = ?", "userType")
if v, ok := queryOptions["inUserIds"]; ok {
query.Where("users.user_id in (?)", pg.Array(v))
}
if err := query.First(); err != nil {
if err.Error() == "pg: no rows in result set" {
return nil, fmt.Errorf("没有此资源")
} else {
return nil, err
queryFunc := func() (interface{}, error) {
query := sqlbuilder.BuildQuery(tx.Model(userModel), queryOptions)
query.SetWhereByQueryOption("users.user_id = ?", "userId")
query.SetWhereByQueryOption("users.status = ?", "status")
query.SetWhereByQueryOption("users.user_type = ?", "userType")
if v, ok := queryOptions["inUserIds"]; ok {
query.Where("users.user_id in (?)", pg.Array(v))
}
if err := query.First(); err != nil {
if err.Error() == "pg: no rows in result set" {
return nil, fmt.Errorf("没有此资源")
} else {
return nil, err
}
}
return userModel, nil
}
var cacheModel = &domain.User{}
if _, ok := queryOptions["userId"]; ok {
cacheModel.UserId = queryOptions["userId"].(int64)
}
if err := repository.QueryCache(cacheModel.CacheKeyFunc, userModel, queryFunc); err != nil {
return nil, err
}
if userModel.UserId == 0 {
return nil, nil
... ... @@ -179,6 +200,7 @@ func NewUserRepository(transactionContext *pgTransaction.TransactionContext) (*U
} else {
return &UserRepository{
transactionContext: transactionContext,
CachedRepository: cache.NewDefaultCachedRepository(),
}, nil
}
}
... ...