diff --git a/.example/database/gdb/mysql/config.toml b/.example/database/gdb/mysql/config.toml index af15452d4..8e48cd1e5 100644 --- a/.example/database/gdb/mysql/config.toml +++ b/.example/database/gdb/mysql/config.toml @@ -1,10 +1,15 @@ -# MySQL数据库配置 +# MySQL. [database] debug = true link = "mysql:root:12345678@tcp(127.0.0.1:3306)/test?parseTime=true&loc=Local" MaxOpen = 100 +# Redis. +[redis] + default = "127.0.0.1:6379,0" + cache = "127.0.0.1:6379,1" + #[database] # [[database.default]] # type = "mysql" diff --git a/.example/database/gdb/mysql/gdb_cache.go b/.example/database/gdb/mysql/gdb_cache.go index ff0848857..cefc858da 100644 --- a/.example/database/gdb/mysql/gdb_cache.go +++ b/.example/database/gdb/mysql/gdb_cache.go @@ -3,6 +3,7 @@ package main import ( "github.com/gogf/gf/database/gdb" "github.com/gogf/gf/util/gutil" + "time" ) func main() { @@ -10,7 +11,7 @@ func main() { Host: "127.0.0.1", Port: "3306", User: "root", - Pass: "123456", + Pass: "12345678", Name: "test", Type: "mysql", Role: "master", @@ -20,19 +21,20 @@ func main() { if err != nil { panic(err) } + //db.GetCache().SetAdapter(adapter.NewRedis(g.Redis())) // 开启调试模式,以便于记录所有执行的SQL db.SetDebug(true) // 执行2次查询并将查询结果缓存3秒,并可执行缓存名称(可选) - for i := 0; i < 2; i++ { - r, _ := db.Table("user").Cache(3, "vip-user").Where("uid=?", 1).One() - gutil.Dump(r.ToMap()) + for i := 0; i < 3; i++ { + r, _ := db.Table("user").Cache(3000*time.Second).Where("id=?", 1).One() + gutil.Dump(r.Map()) } // 执行更新操作,并清理指定名称的查询缓存 - db.Table("user").Cache(-1, "vip-user").Data(gdb.Map{"name": "smith"}).Where("uid=?", 1).Update() + //db.Table("user").Cache(-1, "vip-user").Data(gdb.Map{"name": "smith"}).Where("id=?", 1).Update() // 再次执行查询,启用查询缓存特性 - r, _ := db.Table("user").Cache(3, "vip-user").Where("uid=?", 1).One() - gutil.Dump(r.ToMap()) + //r, _ := db.Table("user").Cache(300000*time.Second, "vip-user").Where("id=?", 1).One() + //gutil.Dump(r.Map()) } diff --git a/database/gdb/gdb.go b/database/gdb/gdb.go index 630123882..d65f317e1 100644 --- a/database/gdb/gdb.go +++ b/database/gdb/gdb.go @@ -166,7 +166,7 @@ type Core struct { DB DB // DB interface object. group string // Configuration group name. debug *gtype.Bool // Enable debug mode for the database. - cache *gcache.Cache // Cache manager. + cache *gcache.Cache // Cache manager, SQL result cache only. schema *gtype.String // Custom schema for this object. dryrun *gtype.Bool // Dry run. prefix string // Table prefix. @@ -438,7 +438,7 @@ func (c *Core) getSqlDb(master bool, schema ...string) (sqlDb *sql.DB, err error node = &n } // Cache the underlying connection pool object by node. - v := c.cache.GetOrSetFuncLock(node.String(), func() interface{} { + v := gcache.GetOrSetFuncLock(node.String(), func() interface{} { sqlDb, err = c.DB.Open(node) if err != nil { intlog.Printf("DB open failed: %v, %+v", err, node) diff --git a/database/gdb/gdb_driver_mssql.go b/database/gdb/gdb_driver_mssql.go index 2aa4cbb81..715a21157 100644 --- a/database/gdb/gdb_driver_mssql.go +++ b/database/gdb/gdb_driver_mssql.go @@ -15,6 +15,7 @@ import ( "database/sql" "errors" "fmt" + "github.com/gogf/gf/os/gcache" "strconv" "strings" @@ -198,10 +199,12 @@ func (d *DriverMssql) TableFields(table string, schema ...string) (fields map[st if len(schema) > 0 && schema[0] != "" { checkSchema = schema[0] } - v := d.DB.GetCache().GetOrSetFunc( + v := gcache.GetOrSetFunc( fmt.Sprintf(`mssql_table_fields_%s_%s`, table, checkSchema), func() interface{} { - var result Result - var link *sql.DB + var ( + result Result + link *sql.DB + ) link, err = d.DB.GetSlave(checkSchema) if err != nil { return nil diff --git a/database/gdb/gdb_driver_mysql.go b/database/gdb/gdb_driver_mysql.go index 2aecc9b3b..cce6d4ec9 100644 --- a/database/gdb/gdb_driver_mysql.go +++ b/database/gdb/gdb_driver_mysql.go @@ -11,6 +11,7 @@ import ( "errors" "fmt" "github.com/gogf/gf/internal/intlog" + "github.com/gogf/gf/os/gcache" "github.com/gogf/gf/text/gregex" "github.com/gogf/gf/text/gstr" @@ -102,11 +103,13 @@ func (d *DriverMysql) TableFields(table string, schema ...string) (fields map[st if len(schema) > 0 && schema[0] != "" { checkSchema = schema[0] } - v := d.cache.GetOrSetFunc( + v := gcache.GetOrSetFunc( fmt.Sprintf(`mysql_table_fields_%s_%s`, table, checkSchema), func() interface{} { - var result Result - var link *sql.DB + var ( + result Result + link *sql.DB + ) link, err = d.DB.GetSlave(checkSchema) if err != nil { return nil diff --git a/database/gdb/gdb_driver_oracle.go b/database/gdb/gdb_driver_oracle.go index 85612c780..a33c9c89e 100644 --- a/database/gdb/gdb_driver_oracle.go +++ b/database/gdb/gdb_driver_oracle.go @@ -16,6 +16,7 @@ import ( "errors" "fmt" "github.com/gogf/gf/internal/intlog" + "github.com/gogf/gf/os/gcache" "github.com/gogf/gf/text/gstr" "reflect" "strconv" @@ -158,7 +159,7 @@ func (d *DriverOracle) TableFields(table string, schema ...string) (fields map[s if len(schema) > 0 && schema[0] != "" { checkSchema = schema[0] } - v := d.DB.GetCache().GetOrSetFunc( + v := gcache.GetOrSetFunc( fmt.Sprintf(`oracle_table_fields_%s_%s`, table, checkSchema), func() interface{} { result := (Result)(nil) @@ -189,7 +190,7 @@ func (d *DriverOracle) TableFields(table string, schema ...string) (fields map[s func (d *DriverOracle) getTableUniqueIndex(table string) (fields map[string]map[string]string, err error) { table = strings.ToUpper(table) - v := d.DB.GetCache().GetOrSetFunc("table_unique_index_"+table, func() interface{} { + v := gcache.GetOrSetFunc("table_unique_index_"+table, func() interface{} { res := (Result)(nil) res, err = d.DB.GetAll(fmt.Sprintf(` SELECT INDEX_NAME,COLUMN_NAME,CHAR_LENGTH FROM USER_IND_COLUMNS diff --git a/database/gdb/gdb_driver_pgsql.go b/database/gdb/gdb_driver_pgsql.go index 9bff38467..785ea8350 100644 --- a/database/gdb/gdb_driver_pgsql.go +++ b/database/gdb/gdb_driver_pgsql.go @@ -16,6 +16,7 @@ import ( "errors" "fmt" "github.com/gogf/gf/internal/intlog" + "github.com/gogf/gf/os/gcache" "github.com/gogf/gf/text/gstr" "strings" @@ -107,10 +108,12 @@ func (d *DriverPgsql) TableFields(table string, schema ...string) (fields map[st if len(schema) > 0 && schema[0] != "" { checkSchema = schema[0] } - v := d.DB.GetCache().GetOrSetFunc( + v := gcache.GetOrSetFunc( fmt.Sprintf(`pgsql_table_fields_%s_%s`, table, checkSchema), func() interface{} { - var result Result - var link *sql.DB + var ( + result Result + link *sql.DB + ) link, err = d.DB.GetSlave(checkSchema) if err != nil { return nil diff --git a/database/gdb/gdb_driver_sqlite.go b/database/gdb/gdb_driver_sqlite.go index 3f9eea3b8..ba61e0496 100644 --- a/database/gdb/gdb_driver_sqlite.go +++ b/database/gdb/gdb_driver_sqlite.go @@ -15,6 +15,7 @@ import ( "errors" "fmt" "github.com/gogf/gf/internal/intlog" + "github.com/gogf/gf/os/gcache" "github.com/gogf/gf/os/gfile" "github.com/gogf/gf/text/gstr" "strings" @@ -98,10 +99,12 @@ func (d *DriverSqlite) TableFields(table string, schema ...string) (fields map[s if len(schema) > 0 && schema[0] != "" { checkSchema = schema[0] } - v := d.DB.GetCache().GetOrSetFunc( + v := gcache.GetOrSetFunc( fmt.Sprintf(`sqlite_table_fields_%s_%s`, table, checkSchema), func() interface{} { - var result Result - var link *sql.DB + var ( + result Result + link *sql.DB + ) link, err = d.DB.GetSlave(checkSchema) if err != nil { return nil diff --git a/database/gdb/gdb_model_select.go b/database/gdb/gdb_model_select.go index 364c93dbb..55b5e39c0 100644 --- a/database/gdb/gdb_model_select.go +++ b/database/gdb/gdb_model_select.go @@ -10,6 +10,7 @@ import ( "fmt" "github.com/gogf/gf/container/gset" "github.com/gogf/gf/container/gvar" + "github.com/gogf/gf/internal/json" "github.com/gogf/gf/text/gstr" "github.com/gogf/gf/util/gconv" "reflect" @@ -431,23 +432,35 @@ func (m *Model) FindScan(pointer interface{}, where ...interface{}) error { // doGetAllBySql does the select statement on the database. func (m *Model) doGetAllBySql(sql string, args ...interface{}) (result Result, err error) { cacheKey := "" + cacheObj := m.db.GetCache() // Retrieve from cache. if m.cacheEnabled && m.tx == nil { cacheKey = m.cacheName if len(cacheKey) == 0 { - cacheKey = sql + "/" + gconv.String(args) + cacheKey = sql + ", @PARAMS:" + gconv.String(args) } - if v := m.db.GetCache().Get(cacheKey); v != nil { - return v.(Result), nil + if v := cacheObj.GetVar(cacheKey); !v.IsNil() { + if result, ok := v.Val().(Result); ok { + // In-memory cache. + return result, nil + } else { + // Other cache, it needs conversion. + var result Result + if err = json.Unmarshal(v.Bytes(), &result); err != nil { + return nil, err + } else { + return result, nil + } + } } } result, err = m.db.DoGetAll(m.getLink(false), sql, m.mergeArguments(args)...) // Cache the result. if cacheKey != "" && err == nil { if m.cacheDuration < 0 { - m.db.GetCache().Remove(cacheKey) + cacheObj.Remove(cacheKey) } else { - m.db.GetCache().Set(cacheKey, result, m.cacheDuration) + cacheObj.Set(cacheKey, result, m.cacheDuration) } } return result, err diff --git a/go.mod b/go.mod index 40dbb46ba..385d6c370 100644 --- a/go.mod +++ b/go.mod @@ -12,10 +12,8 @@ require ( github.com/gqcn/structs v1.1.1 github.com/grokify/html-strip-tags-go v0.0.0-20190921062105-daaa06bf1aaf github.com/json-iterator/go v1.1.10 - github.com/mattn/go-runewidth v0.0.9 // indirect github.com/olekukonko/tablewriter v0.0.1 golang.org/x/net v0.0.0-20200602114024-627f9648deb9 - golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect golang.org/x/text v0.3.2 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c )