308 字
2 分钟
性能优化
使用数据库连接池
func InitDB() { dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal(err) }
sqlDB, err := db.DB() if err != nil { log.Fatal(err) }
// 设置连接池参数 sqlDB.SetMaxIdleConns(10) // 最大空闲连接数 sqlDB.SetMaxOpenConns(100) // 最大打开连接数 sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生命周期}启用 Gzip 压缩
import "github.com/gin-contrib/gzip"
func main() { r := gin.Default()
// 使用 Gzip 中间件 r.Use(gzip.Gzip(gzip.DefaultCompression))
r.GET("/data", func(c *gin.Context) { c.JSON(http.StatusOK, gin.H{ "message": "Large data response", "data": strings.Repeat("x", 10000), }) })
r.Run(":8080")}使用缓存
import ( "github.com/patrickmn/go-cache" "time")
var cacheStore *cache.Cache
func InitCache() { // 创建缓存(默认过期时间 5 分钟,清理间隔 10 分钟) cacheStore = cache.New(5*time.Minute, 10*time.Minute)}
func CacheMiddleware(duration time.Duration) gin.HandlerFunc { return func(c *gin.Context) { // 生成缓存键 key := c.Request.URL.Path + "?" + c.Request.URL.RawQuery
// 尝试从缓存获取 if cached, found := cacheStore.Get(key); found { c.JSON(http.StatusOK, cached) c.Abort() return }
// 创建响应写入器 writer := &responseWriter{ ResponseWriter: c.Writer, body: &bytes.Buffer{}, } c.Writer = writer
c.Next()
// 缓存响应 if c.Writer.Status() == http.StatusOK { cacheStore.Set(key, writer.body.String(), duration) } }}
type responseWriter struct { gin.ResponseWriter body *bytes.Buffer}
func (w *responseWriter) Write(b []byte) (int, error) { w.body.Write(b) return w.ResponseWriter.Write(b)}优化路由
func main() { // 使用 gin.New() 而不是 gin.Default() r := gin.New()
// 只添加必要的中间件 r.Use(gin.Recovery())
// 使用路由分组 api := r.Group("/api/v1") { users := api.Group("/users") { users.GET("", getUsers) users.POST("", createUser) users.GET("/:id", getUser) users.PUT("/:id", updateUser) users.DELETE("/:id", deleteUser) } }
r.Run(":8080")}分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 89 天
部分内容可能已过时