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

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

最佳答案

要使缓存正常工作,必须解决两件事:

  1. 表必须有一个主键才能被缓存。所以 Id 可以是 如下所示作为主键:

    type User struct {
        Id   int `xorm:"pk"`
        Name string
    }
    
  2. 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/

相关文章:

php - 运行 php artisan db :seed more than one and continue for duplicate keys insert

multithreading - 如何处理消息的并行处理?

java - Ehcache Java Spring MVC 和分页 @Cacheable

cocoa - 如何在 Mac 上以编程方式读取 Chrome 和 Firefox 的缓存?

go - 如何在 VSCode 中键入代码时跳过键入“

golang 模板不适用于 httprouter

java - Hibernate查询表中不再存在的字段

hibernate - 如何在 Hibernate 中级联删除集合?

javascript - 如何在 NextJs 中缓存字体?

http - 使用 gocraft 中间件检查 HTTP 请求的主体