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

I currently develop golang projects with xorm.

I want to use a cache to manage the result of sql queries called once. I expected that sql requests would be called once, and would not be called again, but they do get called again.

Also, Redis keys that get created do not appear in redis-cli(keys *).

Why are my sql queries getting called more than once?

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

Two things has to be addressed for the caching to work properly:

  1. Table must have a Primary Key for it to be cached. So Id can be made as Primary Key as follows:

    type User struct {
        Id   int `xorm:"pk"`
        Name string
    }
    
  2. The type User must be registered using Golang's encoding/gob package:

    gob.Register(new(User))
    

Don't forget to drop the existing table and sync the new User structure.

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

The corrected code would look something as follows:

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

I resolved that!

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