gorm-cache
aims to provide a look-aside, almost-no-code-modification cache solution for gorm v2 users. It only applys to situations where database table has only one single primary key.
We provide 2 types of cache storage here:
- Memory, where all cached data stores in memory of a single server
- Redis, where cached data stores in Redis (if you have multiple servers running the same procedure, they don't share the same space in Redis)
package main
import (
"context"
"github.com/redis/go-redis/v9"
"github.com/swordkee/gorm-cache/cache"
"github.com/swordkee/gorm-cache/config"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
dsn := "user:pass@tcp(127.0.0.1:3306)/database_name?charset=utf8mb4"
db, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
redisClient := redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: []string{"localhost:6379"},
})
// More options in `config.config.go`
db.Use(cache.NewPlugin(cache.WithRedisConfig(redisClient))) // use gorm plugin
// cache.AttachToDB(db)
var users []User
ctx := context.Background()
db.WithContext(ctx).Where("value > ?", 123).Find(&users) // search cache not hit, objects cached
db.WithContext(ctx).Where("value > ?", 123).Find(&users) // search cache hit
db.WithContext(ctx).Where("id IN (?)", []int{1, 2, 3}).Find(&users) // primary key cache not hit, users cached
db.WithContext(ctx).Where("id IN (?)", []int{1, 3}).Find(&users) // primary key cache hit
}
There're mainly 5 kinds of operations in gorm (gorm function names in brackets):
- Query (First/Take/Last/Find/FindInBatches/FirstOrInit/FirstOrCreate/Count/Pluck)
- Create (Create/CreateInBatches/Save)
- Delete (Delete)
- Update (Update/Updates/UpdateColumn/UpdateColumns/Save)
- Row (Row/Rows/Scan)
We don't support caching in Row operations.