Cache Invalidation & ORM Hooks
Invalidate cache when models change. Use database.RegisterHooks with cache.Delete or cache.InvalidatePrefix.
Manual invalidation
cache.Delete("user:1")
cache.InvalidatePrefix("user:") // Memory & Redis only
ORM hooks
Register hooks to invalidate cache when a model is created, updated, or deleted.
database.RegisterHooks(db, "users", database.Hooks{
AfterCreate: func(db *gorm.DB) {
if u, ok := db.Statement.Model.(*User); ok {
cache.Delete(fmt.Sprintf("user:%d", u.ID))
cache.Delete("users:list")
}
},
AfterUpdate: func(db *gorm.DB) {
if u, ok := db.Statement.Model.(*User); ok {
cache.Delete(fmt.Sprintf("user:%d", u.ID))
cache.Delete("users:list")
}
},
AfterDelete: func(db *gorm.DB) {
if u, ok := db.Statement.Model.(*User); ok {
cache.Delete(fmt.Sprintf("user:%d", u.ID))
cache.Delete("users:list")
}
},
})
Automatic query caching
Use database.CachedFind for read-heavy queries.
var users []User
err := database.CachedFind(
database.Get().Model(&User{}).Where("active = ?", true),
"users:active",
10*time.Minute,
&users,
)
Invalidate users:active in your hooks when users change.