Skip to content

seefan/gossdb

Repository files navigation

gossdb

English Readme

功能列表

  • 参考官方驱动开发,增加连接池支持,改进协议实现方式,提高了数据吞吐量
  • 支持 set 相关函数
  • 支持 zset 相关函数
  • 支持 hset 相关函数
  • 支持 queue 相关函数
  • 支持 multi 相关函数
  • 支持返回值类型转换,可以方便的把从ssdb中取到的内容转化为指定类型
  • 支持对象json的序列化,只需要开启Encoding选项
  • 支持连接自动回收,支持无错误获取连接,代码调用更简便

2.0主要改进

  • 修改所有函数名字,使其符合golang编码规范,通过 golint 验证
  • 改进协议实现方式,提高解析效率
  • 改进连接池方式,提高连接池的存取效率。连接池由原来的单一连接池,改为块状池,每个块都是一个独立的连接池,多个连接池协作,减少锁的竞争时间
  • 支持连接自动回收,支持无错误获取连接,代码调用更简便。原来使用连接必须判断连接是否获取成功,并手工关闭,现在可以省略掉这部分重复代码,使得您更专注于业务逻辑
  • 解决高并发时的内存泄漏问题,主要是通过回收计时器和重用连接来解决

性能测试,仅作参考,并不实际操作ssdb,只打开连接然后立即回收

  • BenchmarkConnectors_NewClient10-4 5000000 244 ns/op
  • BenchmarkConnectors_NewClient100-4 5000000 215 ns/op
  • BenchmarkConnectors_NewClient1000-4 5000000 281 ns/op
  • BenchmarkConnectors_NewClient5000-4 5000000 282 ns/op

主要配置项

  • Host string //ssdb的ip或主机名
  • Port int //ssdb的端口
  • GetClientTimeout int //获取连接超时时间,单位为秒。默认值: 5
  • ReadWriteTimeout int //连接读写超时时间,单位为秒。默认值: 60
  • WriteTimeout int //连接写超时时间,单位为秒,如果不设置与ReadWriteTimeout会保持一致。默认值: 0
  • ReadTimeout int //连接读超时时间,单位为秒,如果不设置与ReadWriteTimeout会保持一致。默认值: 0
  • MaxPoolSize int //最大连接个数。默认值: 100,PoolSize的整数倍,不足的话自动补足。
  • MinPoolSize int //最小连接个数。默认值: 20,PoolSize的整数倍,不足的话自动补足。
  • PoolSize int //连接池块的连接数。默认值: 20,连接池扩展和收缩时,以此值步进,可根据机器性能调整。
  • MaxWaitSize int //最大等待数目,当连接池满后,新建连接将等待池中连接释放后才可以继续,本值限制最大等待的数量,超过本值后将抛出异常。默认值: 1000
  • HealthSecond int //连接池内缓存的连接状态检查时间隔,单位为秒。默认值: 30
  • Password string //连接的密钥
  • WriteBufferSize int //连接写缓冲,默认为8k,单位为kb
  • ReadBufferSize int //连接读缓冲,默认为8k,单位为kb
  • RetryEnabled bool //是否启用重试,设置为true时,如果请求失败会再重试一次。默认值: false
  • ConnectTimeout int //创建连接的超时时间,单位为秒。默认值: 5
  • AutoClose bool //是否自动回收连接,如果开启后,获取的连接在使用后立即会被回收,所以不要重复使用。
  • Encoding bool //是否开启自动序列化

更多说明请见这里

所有的API基于ssdb的原始API用法,只针对go的特点增加部分方法。所以也可以参照官方文档使用。

引入:

import "github.com/seefan/gossdb/v2"

示例1:使用自动关闭

//打开连接池,使用默认配置,Host=127.0.0.1,Port=8888,AutoClose=true
if err := gossdb.Start(); err != nil {
	panic(err)
}
//别忘了结束时关闭连接池,当然如果你没有关闭,ssdb也会因错误中断连接的
defer gossdb.Shutdown()
//使用连接,因为AutoClose为true,所以我们没有手工关闭连接
//gossdb.Client()为无错误获取连接方式,所以可以在获取连接后直接调用其它操作函数,如果获取连接出错或是调用函数出错,都会返回err
//这时里要注意gossdb.Client()后要立即接调用的函数,这个函数执行完后ssdb的连接会被回收,所以不要重复使用。
if v, err := gossdb.Client().Get("a"); err == nil {
	println(v.String())
} else {
	println(err.Error())
}

调用起来是不是简单很多^_^

示例2: 不使用自动关闭,适用于一个连接进行多个请求的方式

//使用配置文件,没有将AutoClose设置为true
err := gossdb.Start(&conf.Config{
	Host: "127.0.0.1",
	Port: 8888,
})
if err != nil {
	panic(err)
}
defer gossdb.Shutdown()
c, err := gossdb.NewClient()
if err != nil {
	panic(err)
}
defer c.Close()
if v, err := c.Get("a"); err == nil {
	println(v.String())
} else {
	println(err.Error())
}
if v, err := c.Get("b"); err == nil {
	println(v.String())
} else {
	println(err.Error())
}