Xorm Redis缓存似乎无法正常工作

时间:2018-01-11 00:53:20

标签: caching go orm redis

我目前正在开发使用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})
}

2 个答案:

答案 0 :(得分:0)

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

  1. 表必须具有主键才能进行缓存。所以Id可以 作为主键如下:

    type User struct {
        Id   int `xorm:"pk"`
        Name string
    }
    
  2. 必须使用Golang的User包注册encoding/gob类型:

    gob.Register(new(User))
    
  3. 不要忘记删除现有的表并同步新的用户结构。

    // 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})
    }
    

答案 1 :(得分:0)

我解决了!

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})
}