这是我参与「第三届青训营 -后端场」笔记创作活动的第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都为空,如果有多个客户端在未登录的情况下访问相同接口,那么这些缓存都能加快服务端的响应速度。