在 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 里面设置任意类型的值了:
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
本文分享自 roseduan写字的地方 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!