rest - 设置一个每小时查询一次数据库以刷新其数据的 golang API
问题描述
我对 golang 比较陌生,可以使用一些关于如何构建它的高级技巧。我正在尝试构建一个 REST API:
- 用户将通过 POST 方法提供一个小的 JSON 有效负载
- API 将用户的输入数据与存储为结构切片的参考数据集进行比较并计算一个值
- 该值返回给用户
- 每小时查询一个数据库并将结构数据集的切片替换为结构数据集的另一个切片。基本上这会刷新参考数据
- 我希望这个令人耳目一新的工作是异步的,这样它就不会减慢用户体验
我正在使用 golang 的 Echo 框架(https://echo.labstack.com/)。这是我在类似 golang 的伪代码中的尝试。您将如何构建此 API 以每小时异步刷新数据?
为了澄清,我坚持的部分是“在后台每小时异步查询数据库”位。我不确定在那种情况下如何做到这一点。
func main() {
e := echo.New()
e.POST("/", func(something) {
// This func queries the DB and saves reference dataset result as a slice of structs
dataset := refreshDB()
// Does some calculations on input JSON data and reference dataset
result := doCalcs(inputJSON, dataset)
// Prep response in neat JSON
responseForUser := prepOutput(result)
return responseForUser
})
}
解决方案
对于 Go 中的异步代码,您可以使用goroutine,要定期执行代码,您可以使用ticker。
package main
import (
"fmt"
"time"
"sync"
)
var rwm sync.RWMutex
var sliceOfStructs []struct{/* ... */}
func main() {
go func() {
tick := time.NewTicker(time.Hour)
for range tick.C {
rwm.Lock()
sliceOfStructs = []struct{}{ /* refresh with new data */ }
rwm.Unlock()
}
}()
// start server
}
- 如果
sliceOfStructs
需要跨多个包访问,那么您需要将其导出并将其移动到非主包,即可以导入的包。并为rwm
. - 确保读取的任何代码在读取之前和完成时都会
sliceOfStructs
调用。rwm.RLock
rwm.RUnlock
- 如果您有多个 goroutine 需要编写,
sliceOfStructs
那么您应该rwm
从更改sync.RWMutex
为sync.Mutex
.
推荐阅读
- c# - 如何使用 Entity Framework 中的 Contains 获得单个读取操作
- laravel - 在 Laravel 视图中获取 clientOriginalName
- sql-server - 带有 SQL 源连接的 Excel 报表
- reactjs - 可以在 electronjs 应用程序中使用 react-primitives 吗?
- python-3.x - 如何在 Tkinter 中删除现有图形并添加另一个图形?
- wordpress - Wordpress 5.3 tinymce 5 插入图片没有上传/文件选择器按钮
- json - 如何使用 Google Apps 脚本从 Google Drive 中检索 JSON 特定内容?
- php - 如果在 SQL 中的任意两个字符之间替换特殊字符
- google-apps-script - 使用 Google 表格中的复选框清空单元格
- c - 如何在不使用 realloc() 的情况下扩展字符串容量?