gin-cache实践| 青训营笔记

1,274 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

gin-cahche的意义

面对庞大的请求的时候,有些端口是用户会经常访问的端口,且每个用户看到的内容都是一样的。如果这个时候每次请求,服务端都要从mysql里进行查找,然后返回是一件很浪费效率的事。这时候就需要缓存,将之前查找过的数据缓存下来,设置一定的时间,这样接下来的一段时间,用户访问这个接口就能很快接收到响应了。但是缓存和真实数据实际上也是有时差的,如果设置过大,又会影响用户的使用体验。在抖音大项目中,gin是一个广泛使用的框架,而gin的官网也有一个gin-chache组件为gin提供了缓存服务。

实践gin-cache

package main

import (
   "fmt"
   "github.com/gin-contrib/cache"
   "github.com/gin-contrib/cache/persistence"
   "github.com/gin-gonic/gin"
   "net/http"
   "strconv"
   "time"
)

func main() {
   r := gin.Default()
   store := persistence.NewInMemoryStore(time.Minute)
   r.POST("/add", cache.CachePage(store, time.Minute, add))
   r.Run(":8080")
}

func add(c *gin.Context) {
   a := c.Query("a")
   b := c.Query("b")
   fmt.Println("pong")
   aInt, _ := strconv.ParseInt(a, 10, 64)
   bInt, _ := strconv.ParseInt(b, 10, 64)
   c.JSON(http.StatusOK, aInt+bInt)
}

实验结果

pong
[GIN] 2022/06/13 - 20:26:31 | 200 |       513.1µs |       127.0.0.1 | POST     "/add?a=1&b=1"
[GIN] 2022/06/13 - 20:26:37 | 200 |            0s |       127.0.0.1 | POST     "/add?a=1&b=1"
[GIN] 2022/06/13 - 20:26:38 | 200 |            0s |       127.0.0.1 | POST     "/add?a=1&b=1"
pong
[GIN] 2022/06/13 - 20:27:11 | 200 |       715.6µs |       127.0.0.1 | POST     "/add?a=1&b=2"

对于相同请求参数,gin不再执行add方法(没有打印出pong),而是返回之前的响应。相同接口但是请求参数不同,则会执行add方法(打印pong)。

总结

gin-cache对于相同接口不同请求体会生成不同的响应缓存。在项目中可以为各个接口加上这个缓存。具体场景如下:对于未登录用户,他们的token都为空,如果有多个客户端在未登录的情况下访问相同接口,那么这些缓存都能加快服务端的响应速度。