gorm-cache
gorm-cache copied to clipboard
gorm v2的一个即插即用的旁路缓存解决方案
gorm-cache
gorm-cache
æ¨å¨ä¸ºgorm v2ç¨æ·æä¾ä¸ä¸ªå³æå³ç¨çæè·¯ç¼å解å³æ¹æ¡ãæ¬ç¼ååªéç¨äºæ°æ®åºè¡¨å主é®æ¶çåºæ¯ã
ç¹æ§
- å³æå³ç¨
- æè·¯ç¼å
- ç©¿éé²æ¤
- å»ç©¿é²æ¤
- å¤åå¨ä»è´¨ï¼å å/redisï¼
使ç¨è¯´æ
import (
"context"
"github.com/asjdf/gorm-cache/cache"
"github.com/asjdf/gorm-cache/storage"
"github.com/redis/go-redis/v9"
)
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.NewClient(&redis.Options{
Addr: "localhost:6379",
})
cache, _ := cache.NewGorm2Cache(&config.CacheConfig{
CacheLevel: config.CacheLevelAll,
CacheStorage: storage.NewRedis(&storage.RedisStoreConfig{Client: redisClient}),
InvalidateWhenUpdate: true, // when you create/update/delete objects, invalidate cache
CacheTTL: 5000, // 5000 ms
CacheMaxItemCnt: 50, // if length of objects retrieved one single time
// exceeds this number, then don't cache
})
// More options in `config/config.go`
db.Use(cache) // use gorm plugin
// cache.AttachToDB(db)
var users []User
db.Where("value > ?", 123).Find(&users) // search cache not hit, objects cached
db.Where("value > ?", 123).Find(&users) // search cache hit
db.Where("id IN (?)", []int{1, 2, 3}).Find(&users) // primary key cache not hit, users cached
db.Where("id IN (?)", []int{1, 3}).Find(&users) // primary key cache hit
}
å¨gormä¸ä¸»è¦æ5ç§æä½ï¼æ¬å·ä¸æ¯gormä¸å¯¹åºå½æ°åï¼:
- 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)
æ¬åºä¸æ¯æRowæä½çç¼åãï¼WIPï¼
åå¨ä»è´¨ç»è
æ¬åºæ¯æ使ç¨2ç§ cache åå¨ä»è´¨ï¼
- å å (ccache/gcache)
- Redis (æææ°æ®åå¨å¨redisä¸ï¼å¦æä½ æå¤ä¸ªå®ä¾ä½¿ç¨æ¬ç¼åï¼é£ä¹ä»ä»¬ä¸å ±äº«redisåå¨ç©ºé´)
并ä¸å 许å¤ä¸ªgorm-cacheå ¬ç¨ä¸ä¸ªåå¨æ± ï¼ä»¥ç¡®ä¿åä¸æ°æ®åºçå¤ä¸ªgormå®ä¾å ±äº«ç¼åã