我目前使用 xorm 开发 golang 项目。
我想使用缓存来管理调用一次的 sql 查询的结果。我预计 sql 请求将被调用一次,并且不会被再次调用,但它们确实被再次调用。
此外,创建的 Redis 键不会出现在 redis-cli(keys *) 中。
为什么我的 sql 查询被调用不止一次?
package main
import (
"github.com/go-xorm/xorm"
_ "github.com/go-sql-driver/mysql"
xrc "github.com/go-xorm/xorm-redis-cache"
)
type User struct {
Id int
Name string
}
func main() {
engine, err := xorm.NewEngine("mysql", "root:@/xorm_test_db")
if nil != err {
log.Fatal(err)
}
engine.ShowSQL(true)
cacher := xrc.NewRedisCacher("localhost:6379", "", xrc.DEFAULT_EXPIRATION, engine.Logger())
engine.SetDefaultCacher(cacher)
engine.Get(User{Id: 1})
engine.Get(User{Id: 1})
}
最佳答案
要使缓存正常工作,必须解决两件事:
表必须有一个主键才能被缓存。所以
Id
可以是 如下所示作为主键:type User struct { Id int `xorm:"pk"` Name string }
User
类型必须使用 Golang 的encoding/gob
包注册:gob.Register(new(User))
不要忘记删除现有表并同步新的用户结构。
// Drop the existing table
DROP TABLE user;
// Sync the User struct to table
engine.Sync(new(User))
// Create a sample user
engine.Insert(&User{Id: 1, Name: "user1"})
更正后的代码如下所示:
package main
import (
"github.com/go-xorm/xorm"
_ "github.com/go-sql-driver/mysql"
xrc "github.com/go-xorm/xorm-redis-cache"
"encoding/gob"
)
type User struct {
Id int `xorm:"pk"`
Name string
}
func main() {
gob.Register(new(User))
engine, err := xorm.NewEngine("mysql", "root:@/xorm_test_db")
if nil != err {
log.Fatal(err)
}
engine.ShowSQL(true)
cacher := xrc.NewRedisCacher("localhost:6379", "", xrc.DEFAULT_EXPIRATION, engine.Logger())
engine.SetDefaultCacher(cacher)
engine.Get(User{Id: 1})
engine.Get(User{Id: 1})
}
关于caching - Xorm Redis 缓存似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48198370/