byoj 项目开发日志
本文最后更新于:2023-05-17 02:32:55 UTC+08:00
项目地址:https://github.com/ligen131/byoj
总览
序号 | 项目 | 是否完成 |
---|---|---|
0 | 外部排序 External Sort | ✅ |
1 | 用户注册 | ✅ |
2 | 用户登录 (通过 JWT 鉴权与验证身份) | ✅ |
3 | 新增帖子与查询帖子列表 | ✅ |
4 | API 文档 | ❌ |
5 | Docker | ✅ |
文档及教程参考
外部排序
参考
io
包 https://segmentfault.com/a/1190000015591319io.Copy()
https://juejin.cn/post/6844904033216364557bufio.Scanner
https://zhuanlan.zhihu.com/p/37673679- 有无缓冲 channel 区别 https://www.runoob.com/note/43083
外排序的一个例子是外归并排序(External merge sort),它读入一些能放在内存内的数据量,在内存中排序后输出为一个顺串(即是内部数据有序的临时文件),处理完所有的数据后再进行归并。比如,要对900 MB的数据进行排序,但机器上只有100 MB的可用内存时,外归并排序按如下方法操作:
读入100 MB的数据至内存中,用某种常规方式(如快速排序、堆排序、归并排序等方法)在内存中完成排序。
将排序完成的数据写入磁盘。
读入每个临时文件(顺串)的前10 MB( = 100 MB / (9块 + 1))的数据放入内存中的输入缓冲区,最后的10 MB作为输出缓冲区。(实践中,将输入缓冲适当调小,而适当增大输出缓冲区能获得更好的效果。)
执行九路归并算法,将结果输出到输出缓冲区。一旦输出缓冲区满,将缓冲区中的数据写出至目标文件,清空缓冲区。一旦9个输入缓冲区中的一个变空,就从这个缓冲区关联的文件,读入下一个10M数据,除非这个文件已读完。这是“外归并排序”能在主存外完成排序的关键步骤 -- 因为“归并算法”(merge algorithm)对每一个大块只是顺序地做一轮访问(进行归并),每个大块不用完全载入主存。
Ref: https://zh.wikipedia.org/zh-cn/%E5%A4%96%E6%8E%92%E5%BA%8F
bufio
自动实现带缓冲区的文件 I/O。参考 - http://c.biancheng.net/view/4595.html - https://zhuanlan.zhihu.com/p/73690883
想了好久不知道和并发有什么关系,也许是合并的时候可以并发操作。
设文件大小 size
,空间限制 limit
,k
路归并,则有如下基本流程:
- 分别读取大小为
limit
的数据块,排序并分别存下来,则数据块数量(即新的文件数量)blockNum = ceil(size / limit)
- 并发地取
k
块数据(不足k
块就取剩下的),则文件 I/O 缓冲区大小inBufferSize = floor(limit / (blockNum + ceil(blockNum / k)))
,对于每k
块数据通过 channel 进行合并,输出,更新blockNum = ceil(blockNum / k)
- 重复上述操作,直到
blockNum
为 1 时,最后一个文件即为排序后的结果 - 关闭所有文件,删除临时文件(优化:每次合并完都把上一次的文件删除)
11/13 2:30 没想到一个简单的排序细节也很多,把内部排序先搞定,有空再继续。
11/22 2:45 搞定。细节还是挺多的。
使用了锁 sync.Mutex
来保护变量不被同时改变。
Online Judge
前置
参考
Go 项目结构:如何在 Go 项目中使用 MVC ? https://learnku.com/go/t/48112 原文 https://www.calhoun.io/using-mvc-to-structure-go-web-applications/
Q:
models
里面只能放数据库相关?那么其他处理逻辑放在哪里?service
?Flat Application Structure in Go https://www.calhoun.io/flat-application-structure/
代码结构中Dao,Service,Controller,Util,Model是什么意思,为什么划分? - 暗灭的回答 - 知乎 https://www.zhihu.com/question/58410621/answer/156868800
RESTful API 设计指南 https://www.ruanyifeng.com/blog/2014/05/restful_api.html
PostgreSQL 教程 | 菜鸟教程 https://www.runoob.com/postgresql/postgresql-tutorial.html
gorm 官方文档 https://gorm.io/docs/create.html
什么是中间件?常见中间件有哪些?http://c.biancheng.net/view/3860.html
中间件位于客户机 / 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。
按上面的说法,不是很懂 API 是不是就相当于中间件。
似乎在 JWT 鉴权的时候会用到中间件 https://blog.csdn.net/leo_jk/article/details/123779032 // 先放一放
echo 官方文档 https://pkg.go.dev/github.com/labstack/echo/v4#section-documentation
梳理一下要干什么:
首先,MVC,项目结构(初定)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15oj/
main.go
models/
model.go # 连接数据库,获取 model 等
users.go
controllers/
users.go
router/
router.go # API 设计、response,调用 controllers 函数
users.go
middleware/
jwt.go
utils/
utils.go
logs.gorouter
中echo
创建服务端service
处理请求controllers
解析、校验、处理请求,执行逻辑,调用models
中 PostgreSQL 数据库(包grom
),实现 CURDref: controller 和 service 怎么区分呢? https://cnodejs.org/topic/5d312d93b2b9222961dac21d
JWT 鉴权
项目结构框架
关于数据库
- ORM http://www.ruanyifeng.com/blog/2019/02/orm-tutorial.html
- GORM https://gorm.io/zh_CN/docs/index.html https://pkg.go.dev/gorm.io/gorm@v1.25.0
- 数据库事务 https://github.com/kkkstra/NGB/issues/10
杂项
Context
https://segmentfault.com/a/1190000040917752- HTTP 状态码 https://www.runoob.com/http/http-status-codes.html
zap
日志 https://pkg.go.dev/go.uber.org/zap#Object
JWT 鉴权与中间件
- User Authentication in Go Echo with JWT https://webdevstation.com/posts/user-authentication-with-go-using-jwt-token/
- JWT: Token or Cookie? https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/31 https://tech.meituan.com/2018/10/11/fe-security-csrf.html
- 中间件 http://echo.topgoer.com/%E4%B8%AD%E9%97%B4%E4%BB%B6/%E5%AE%89%E5%85%A8.html
- RFC 7519 https://datatracker.ietf.org/doc/html/rfc7519
- JWT Debugger https://jwt.io/#debugger-io
Docker