前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rosedb 支持了一个实用的特性

rosedb 支持了一个实用的特性

作者头像
roseduan
发布2021-10-09 11:12:00
3770
发布2021-10-09 11:12:00
举报

在 rosedb 最开始的设计当中,为了更方便的对数据进行 read 和 write,方法只能传入和输出字节数组类型的参数,即 []byte

但是,在我后续使用时,常常会发现这样不太方便,例如一个字符串 string 类型,也得强制转换成 []byte 才行,代码看起来不是很简洁,如果是 struct 类型就更不必说了。

于是我就想到去支持任意类型的参数(interface{}),思路其实很简单,主要就是利用了序列化的方式,将任意类型的参数转换成 []byte 类型,在获取数据时,需要传入目标类型对其进行反序列化。

目前 Go 语言的序列化和反序列化工具很多,自带的有 json、xml、gob 等,在选择序列化工具时,主要参考了鸟窝大佬的一个 Benchmark,对一些比较流行的序列化库做了测试,能够很好的看到各个库的性能表现。

参考文章:https://colobu.com/2015/09/28/Golang-Serializer-Benchmark-Comparison/

Github 地址:https://github.com/smallnest/gosercomp

最后选择了 msgpack 这个库,这个库的 Marshal 和 UnMarshall 都在 100 纳秒左右,性能很好,并且是开箱即用,序列化后的 size 很小。

在 msgpack 的官网介绍中,我看到 Redis 其实也用到了这个序列化库。

做了简单的集成之后,就可以往 rosedb 里面设置任意类型的值了:

代码语言:javascript
复制
tests := []struct {
   key interface{}
   val interface{}
}{
   {"aaa", nil},
   {nil, "bbb"},
   {[]byte("kk2"), []byte("rosedb5")},
   {true, 1232},
   {false, 1232},
   {float32(4.4122), float32(9102.22)},
   {"kk44", "c"},
   {1, 34},
}

for _, tt := range tests {
   err := roseDB.Set(tt.key, tt.val)
   assert.Equal(t, err, nil)
}

一个开源项目,依靠绝对的性能表现去制胜其实是不太现实的,易用性,文档的完善,包括社区等都是非常重要的组成要素,在 rosedb 上去做这些与性能无关的功能,其实就是基于这个考虑。

最后说一句,目前 rosedb 项目还比较基础,如果你对 k-v、存储方面感兴趣的话,可以加入到项目中来,共同完善,相信这也能够自身的能力有一个很大的提升。

目前已经有几位优秀的小伙伴主动联系到我了,欢迎有更多的人加入进来!

ps: 可加我 vx 细聊:kiss_duan

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-09-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 roseduan写字的地方 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档