golang实现的高性能嵌入式持久化队列dque发布新版本
golang实现的高性能嵌入式持久化队列dque发布新版本 Dque 现已发布第 2 版。
v2 版本新增了涡轮模式功能,该模式不再对每次入队和出队操作执行磁盘同步,而是由操作系统决定同步时机。在我的本地 SSD 驱动器上,这一改进使性能提升了约 10 倍。涡轮模式默认处于关闭状态。
joncrlsn/dque
dque 是一个为 Go 语言打造的快速、嵌入式、持久化队列。欢迎通过创建 GitHub 账户为 joncrlsn/dque 的开发贡献力量。
希望尝试使用的用户能提供代码审查和反馈意见。包括:是否易于使用和理解?文档是否清晰?是否存在反模式的使用?(我个人认为没有,但有时可能会疏忽)。同时我也需要关于版本管理的建议,以支持 Go 1.11 中的新模块系统。目前我对此尚未完全掌握。
更多关于golang实现的高性能嵌入式持久化队列dque发布新版本的实战教程也可以访问 https://www.itying.com/category-94-b0.html
你好Johan,感谢你审阅我的代码。我通常进行白盒测试(在同一包内),但其中一个测试我只想测试API。所以我将包名末尾加上了_test。这是我之前见过的一个示例。
很高兴你提出质疑,因为通过访问内部实现我可能还能进行更多测试。
当我使用DQue时,指的是具有TurboOn()和TurboOff()方法的公共对象。当我使用dque时,指的是这个包。感谢你花时间查看我的代码。
- Jon
更多关于golang实现的高性能嵌入式持久化队列dque发布新版本的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
嗨
我快速浏览了一下,注意到两件事。在大部分书面内容中,您将包称为Dque而不是dque,比如在讨论开启关闭turbo模式时。
为什么将测试放在单独的包中?这并非必要,在testing包 - testing - Go Packages中提到:
要编写新的测试套件,请创建一个以_test.go结尾的文件,其中包含此处所述的TestXxx函数。将文件放在与被测试包相同的包中。该文件将在常规包构建时被排除,但在运行"go test"命令时会被包含。更多详情,请运行"go help test"和"go help testflag"。
以下是关于 dque v2 版本的评论,重点介绍了新功能、性能改进以及使用示例。作为 Go 语言的嵌入式持久化队列,dque 在 v2 中引入的涡轮模式显著提升了吞吐量,这在高并发场景下非常实用。
涡轮模式性能提升
涡轮模式通过减少磁盘同步操作来优化性能,这在本地 SSD 测试中实现了约 10 倍的提升。默认情况下该模式关闭,用户需手动启用以避免潜在的数据丢失风险。以下是一个启用涡轮模式的示例代码:
package main
import (
"github.com/joncrlsn/dque"
"log"
)
// 定义一个简单的队列项结构,必须实现 Serializable 接口
type Item struct {
Name string
}
func (i *Item) Serialize() ([]byte, error) {
return []byte(i.Name), nil
}
func (i *Item) Deserialize(data []byte) error {
i.Name = string(data)
return nil
}
func main() {
// 创建或打开一个 dque 队列,指定目录和项构建器
q, err := dque.NewOrOpen("myQueue", "./queueDir", 100, func() interface{} {
return &Item{}
})
if err != nil {
log.Fatal("Failed to open queue:", err)
}
defer q.Close()
// 启用涡轮模式以提升性能
q.TurboOn()
// 入队一个项
err = q.Enqueue(&Item{Name: "example"})
if err != nil {
log.Fatal("Enqueue failed:", err)
}
// 出队一个项
iface, err := q.Dequeue()
if err != nil {
log.Fatal("Dequeue failed:", err)
}
item := iface.(*Item)
log.Println("Dequeued item:", item.Name)
}
在这个示例中,TurboOn() 方法启用了涡轮模式,从而减少了磁盘同步。注意,在启用此模式时,如果系统崩溃,未同步的数据可能丢失,因此建议在可容忍数据丢失的场景下使用。
项目贡献和反馈
dque 是一个开源项目,鼓励社区通过 GitHub 参与贡献。对于代码审查,建议关注以下方面:
- 易用性:API 设计是否直观,例如队列的创建和操作是否简单。
- 文档清晰度:README 和代码注释是否足够详细,帮助用户快速上手。
- 反模式检查:例如,确保队列项正确实现序列化接口,避免数据损坏。
关于 Go 模块支持,dque 可以集成 Go 1.11+ 的模块系统来管理依赖。以下是一个简单的 go.mod 文件示例,用于在项目中使用 dque:
module myapp
go 1.11
require github.com/joncrlsn/dque v2.0.0
这允许用户通过 go get 命令获取最新版本,并自动处理依赖关系。
总体而言,dque v2 的涡轮模式是一个重大改进,适用于需要高性能队列的嵌入式应用。建议用户在实际项目中测试并提供反馈,以帮助进一步优化。

