首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xorm Redis缓存似乎无法工作

Xorm Redis缓存似乎无法工作
EN

Stack Overflow用户
提问于 2018-01-11 08:53:20
回答 2查看 376关注 0票数 0

我目前使用xorm开发golang项目。

我想使用缓存来管理调用一次的sql查询的结果。我预计sql请求将被调用一次,并且不会再次被调用,但它们确实被再次调用。

此外,创建的Redis密钥不会出现在redis-cli(key *)中。

为什么我的sql查询被多次调用?

代码语言:javascript
复制
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})
}
EN

回答 2

Stack Overflow用户

发布于 2018-01-11 22:20:33

要使缓存正常工作,必须解决两个问题:

  1. 表必须具有要缓存的主键。因此Id可以作为主键,如下所示:

类型User struct { Id int xorm:"pk" Name string }

  • 类型User必须使用Golang的encoding/gob包注册:

gob.Register(new(User))

不要忘记删除现有的表并同步新的用户结构。

代码语言:javascript
复制
// 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"})

更正后的代码将如下所示:

代码语言:javascript
复制
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})
}
票数 0
EN

Stack Overflow用户

发布于 2018-01-12 20:32:26

我解决了这个问题!

代码语言:javascript
复制
package main

import (
"github.com/go-xorm/xorm"
_ "github.com/go-sql-driver/mysql"
xrc "github.com/go-xorm/xorm-redis-cache"

"encoding/gob"
"log"
)

type User struct {
    Id   int    `xorm:"pk"`
    Name string `xorm:"'name'"`
}

func main() {
    gob.Register(new(User))

    engine, err := xorm.NewEngine("mysql", "root:@/xorm_test2?charset=utf8")
    if nil != err {
        log.Fatal(err)
    }
    engine.Sync(new(User))
    engine.Insert(&User{Id: 1, Name: "user1"})

    engine.ShowSQL(true)
    cacher := xrc.NewRedisCacher("localhost:6379", "", xrc.DEFAULT_EXPIRATION, engine.Logger())
    engine.SetDefaultCacher(cacher)
    engine.MapCacher(&User{}, cacher)

    engine.Get(&User{Id: 1})
    engine.Get(&User{Id: 1})
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48198370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档