作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


接上一篇:http 中使用 gzip 输出内容时,如何预先压缩前一半页面?

经过实测,对线上一个输出 html 的服务进行了改造,通过预先压缩页面前半部分的方法,此接口的性能提升了 20%.

对比项 无 gzip 压缩 gzip 压缩+前半部分预压缩
输出字节数 4399 2246
每核 qps 14052.63 16924.75

具体的写法如下:

1.获取改造后的库

go get github.com/ahfuzhang/compress@v1.17.2

2.在 go.mod 中修改:

replace (
github.com/klauspost/compress => github.com/ahfuzhang/compress v1.17.2
) require (
github.com/klauspost/compress v1.16.3
github.com/valyala/bytebufferpool v1.0.0
github.com/valyala/fasthttp v1.50.0
)

3.代码:

package main

import (
"bytes"
_ "embed"
"fmt"
"log"
"os" "github.com/klauspost/compress/gzip"
"github.com/valyala/bytebufferpool"
"github.com/valyala/fasthttp"
) //go:embed raw.html
var html string //go:embed raw.js
var js string func testGzipedHttp() {
topHalf, digest := gzip.GetGzipedData([]byte(html)) // cache 页面的前一半, digest 是这些内容的 crc32 的校验和
requestHandler := func(ctx *fasthttp.RequestCtx) {
ctx.Response.Header.Add("Content-Type", "text/plain")
ctx.Response.Header.Add("Content-Encoding", "gzip") switch string(ctx.Request.URI().RequestURI()) {
case "/1": // direct output
w, _ := gzip.NewWriterLevel(ctx, gzip.BestCompression)
w.Write([]byte(html))
w.Write([]byte(js))
w.Close()
case "/2":
w := gzip.GetWriter(ctx) // 使用对象池
w.WriteHeader() // 写 gzip 的头部信息,10 字节
w.WriteGzipedData([]byte(html), topHalf, digest)
// 当这个缓存是第一次输出的时候,可以传入 digest 值,这样可以少算一次 crc32
// 当不是第一次输出的时候, 第三个参数 digest 填 0 w.Write([]byte(js))
gzip.PutWriter(w) // 必须调用,写入尾部信息,并放回对象池
}
} s := &fasthttp.Server{
Handler: requestHandler,
}
if err := s.ListenAndServe(":8080"); err != nil {
log.Fatalf("error in ListenAndServe: %v", err)
}
} func main() {
testGzipedHttp()
}

希望对你有用

fasthttp + `page partial gziped cache`: 页面输出服务性能提升20%的更多相关文章

  1. paip.cache 缓存架构以及性能提升总结

    paip.cache 缓存架构以及性能提升总结 1         缓存架构以及性能(贯穿读出式(LookThrough) 旁路读出式(LookAside) 写穿式(WriteThrough) 回写式 ...

  2. 云 MongoDB 优化让 LBS 服务性能提升十倍

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战.M ...

  3. 必看!如何让你的LBS服务性能提升十倍!

    本文由云+社区发表 作者:腾讯云数据库团队 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战.MongoDB对LB ...

  4. JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术

    JSP JSP(Java Server Page)是一种实现普通静态HTML和动态页面输出混合编码的技术.从这一点来看,非常类似Microsoft ASP.PHP等技术.借助形式上的内容和外观表现的分 ...

  5. ASP.NET缓存全解析2:页面输出缓存 转自网络原文作者李天平

    页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中.当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期.在这个过程中,缓存内容直接发送给用户,而不必再次 ...

  6. 把aspx页面输出成xml的方法注意事项

    先贴代码 Response.Charset = "gb2312"; Response.ContentType = "text/xml"; Response.Co ...

  7. varnish页面缓存服务

    varnish页面缓存服务 https://www.cnblogs.com/L-dongf/p/9310144.html http://blog.51cto.com/xinzong/1782669 阅 ...

  8. ASP.Net 更新页面输出缓存的几种方法

    ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟.如何快速更新缓存数据,有时成了困扰程序员的难题.根据我的使用经验,总结了下面几种方法,概括了 ...

  9. MVC-Cache-1.输出缓存(Cache:[1].输出缓存2.应用程序缓存)

    缓存前提概念: 1.使用缓存的目的就是为提供网站性能,减轻对数据库的压力,提高访问的速度. 2.如果使用缓存不当,比不使用缓存造成的影响更恶劣(缓存数据的更新不及时.缓存过多等). 3..net MV ...

  10. tp5页面输出时,搜索后跳转下一页的处理

    tp5页面输出时,搜索功能在跳转下一页时,如果不做任何处理,会返回原有是第二页输出的数据.为了保证跳转下一页时输出的是搜索到的数据,做以下处理. (要根据自己的搜索字段进行适当修改) 页面js代码,给 ...

随机推荐

  1. 前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页

    前端vue简单好用的上拉加载下拉刷新组件,支持列表分页 本地分页, 下载完整代码请访问uni-app插件市场地址: https://ext.dcloud.net.cn/plugin?id=12942 ...

  2. 如何刷新 DNS 缓存 (macOS, Linux, Windows)

    如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, De ...

  3. Codeforces Round #883 (Div. 3) A-G

    比赛链接 A 代码 #include <bits/stdc++.h> using namespace std; using ll = long long; bool solve() { i ...

  4. P3574 [POI2014] FAR-FarmCraft 吐槽 + 题解

    洛谷上面的题解写的真的不太好,有很多错误,我来谈谈自己的理解. 设 \(f[i]\) 表示以 \(i\) 为根节点的子树中(包括节点 \(i\))的所有人安装好游戏所需要的时间(与下面的 \(g[i] ...

  5. 超详细整合SSM框架--(Spring + Spring MVC + MyBatis)

    超详细整合SSM框架--(Spring + Spring MVC + MyBatis) 阅读该文章之前首先要清楚Spring框架,SpringMVC框架,Mybatis框架. SSM框架,是Sprin ...

  6. 聊聊又拍云存储 S3 协议的使用

    近期,有细心的同学发现,在又拍云控制台中的云存储产品中增加了针对 S3 协议标准的兼容支持,授权用户通过 S3 协议标准对存储空间的数据进行读写操作.此配置操作之前是由人工协助的方式提供给用户使用的, ...

  7. Cilium系列-5-Cilium替换KubeProxy

    系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, ...

  8. 使用DBeaver连接数据库

    下载网站:官网下载 参考链接:使用 DBeaver 连接 OceanBase

  9. FPGA移位加三法

    介绍 BCD码 BCD码的英文全称是Binary-Coded Decimal‎,简称BCD,按字面解释是二进制十进制代码,是一种二进制的数字编码形式. 常见的BCD码有8421BCD码,2421BCD ...

  10. pandas 根据内容匹配并获取索引

    bool = ExcelDataStr.str.contains("Item No./Customer/Saler") # 初始位置:initial position, 终位置:e ...