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.