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")
}
性能优化
https://shirone.mysqil.com/posts/gin/性能优化/
作者
HikariTish
发布于
2026-07-18
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取