GoLang简便模板缓存实现
在GoLang开发中当项目运行时go的html/template默认行为是每次请求都得重新解析模板文件当高并发频繁的磁盘读取会造成非常大的负担成为明显瓶颈所以为了避免重复解析模板文件减少磁盘I/O和CPU开销模板缓存系统诞生。以下是非常简便的模板缓存系统的实现大家可以根据这个简便的例子来理解这个系统。文件准备模板页面 base.page.html{{define base}} html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1 titleDocument/title /head body {{block content .}} {{end}} /body /html {{end}}目标页面 home.page.html{{template base .}} {{define content}} div classcontainer div classrow div classcol h1This is the Home Page/h1 pThis is some text/p /div /div /div {{end}}我们这里准备了一个模板页面和一个目标文件可以看到目标文件是以模板文件来设计布局的。然后我们可以开始设计模板缓存系统了。首先我们先make出一个mapkey键值存目标页面的名字value值存模板的相关信息var tc make(map[string]*template.Template)然后每次刷新页面后我们先到这个map中查询是否存在这个名字的页面模板如果不存在我们需要从磁盘读取这个页面文件第一次从磁盘中加载并将这个模板存进这个map中实现缓存的效果如果读取到了那就直接从缓存读取这个模板页面被快速地刷新读取出来比从磁盘读取的速度快很多。func RenderTemplate(w http.ResponseWriter, t string) { var tmpl *template.Template var err error _, inMap : tc[t] if !inMap { //需要将这个模板放进tc切片中 err CreateTemplateCache(t) if err ! nil { log.Println(err) } log.Println(模板未使用过正在创建模板缓存...) } else { log.Println(正在使用模板缓存...) } tmpl tc[t] err tmpl.Execute(w, nil) }接着我们再创建一个创建模板缓存的函数也就是将模板存入map中。这段代码实现了一个模板缓存的创建函数接收模板名称参数后自动拼接该模板文件路径和基础布局模板路径调用Go标准库的 template.ParseFiles 一次性解析这两个文件将解析后的模板对象存入全局缓存映射 tc 中若解析过程中遇到文件不存在或模板语法错误则立即返回错误否则成功缓存供后续请求直接复用避免了每次HTTP请求都重复读取磁盘和解析模板的开销。func CreateTemplateCache(t string) error { templates : []string{ fmt.Sprintf(./template/%s, t), ./template/base.layout.html, } tmpl, err : template.ParseFiles(templates...) if err ! nil { return err } tc[t] tmpl return nil }最后我们查看实现的效果可以看到第一次是从磁盘读取的后面刷新了几次就从缓存中直接读取了。到这里一个非常简便的模板缓存系统就完成了。

相关新闻

最新新闻

日新闻

周新闻

月新闻