public function list()
{
$sql="select * from cms_blog limit 20";
$list=DB::select($sql);
return $this->success($list);
}
func (t *BlogController) GetList(c *gin.Context) {
blog:=model.BlogModel{}
List := blog.GetList()
c.JSON(200, gin.H{
"code":10000,
"msg": "ok",
"data": List,
})
return
}
func (m *BlogModel) GetList() ([]Blog) {
list := make([]Blog, 0)
err := Db.Limit(20).Find(&list).Error
if err != nil {
return nil
}
return list
}
我们先来看看在相同并发下,go的表现怎么样
在并发120的情况下,得出以下数据
并发:120
吞吐量:1122(每秒处理请求数) ,是PHP的10倍左右
90请求时间:42(单位是毫秒),只有PHP的1/400
平均请求时间:20 只有PHP的1/600
为了性能的考虑,我们加入超时机制,响应时间限制为2s以内,相关代码如下
func (t *BlogController) GetList(c *gin.Context) {
var res []model.Blog
// 在规定时间内返回成功进入success
var success = make(chan []model.Blog)
//设置超时时间2s
ctx, cancel := context.WithTimeout(c, 2*time.Second)
defer cancel()
go func() {
wg := sync.WaitGroup{}
wg.Add(1)
defer wg.Done()
blog := model.BlogModel{}
res, err := blog.GetList()
if err != nil {
fmt.Println("i got an error")
fmt.Println(err)
success <- nil
return
}
success <- res
wg.Wait()
}()
for {
select {
case res = <-success:
c.JSON(200, gin.H{
"code": 200,
"msg": "ok",
"data": res,
})
return
case <-ctx.Done():
c.JSON(http.StatusBadGateway, gin.H{"code": 999})
return
}
}
}
func (m *BlogModel) GetList() ([]Blog, error) {
list := make([]Blog, 0)
err := Db.Limit(20).Find(&list).Error
if err != nil {
return nil, err
}
return list, nil
}