• Stars
    star
    131
  • Rank 275,867 (Top 6 %)
  • Language
    Go
  • License
    MIT License
  • Created about 10 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ssdb client for go with pool surport

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())
}