资讯专栏INFORMATION COLUMN

Golang的Redis客户端,支持单机,哨兵,集群

时飞 / 2667人阅读

摘要:基于的二次封装,提供种部署模式下的统一接口,使得更换部署模式对业务透明项目地址开发进度部署模式代码完成度测试完成度依赖包单例,,哨兵模式集群模式方法说明订阅命令方法定义普通命令方法定义执行订阅回调方法执行命令回调方法下列方法都是封装了方法

基于 gomodule/redigo 的二次封装,提供 stand-alone sentinel cluster 3种部署模式下的统一接口,使得更换 redis 部署模式对业务透明

项目地址

Github:https://github.com/letsfire/r...

开发进度
Mode部署模式 代码完成度 测试完成度 依赖包
alone 单例,Twemproxy,Codis 100% 100%
sentinel 哨兵模式 100% 100% FZambia/sentinel
cluster 集群模式 100% 100% mna/redisc
方法说明

订阅命令方法定义 type SubFunc func(c redis.PubSubConn) (err error)

普通命令方法定义 type ExecFunc func(c redis.Conn) (res interface{}, err error)

执行订阅回调方法 Sub(fn SubFunc) (err error)

执行命令回调方法 Exec(fn ExecFunc) (interface{}, error)

下列方法都是封装了Exec方法,格式化返回值的类型

Int(fn ExecFunc) (int, error)

Ints(fn ExecFunc) ([]int, error)

IntMap(fn ExecFunc) (map[string]int, error)

Int64(fn ExecFunc) (int64, error)

Int64s(fn ExecFunc) ([]int64, error)

Int64Map(fn ExecFunc) (map[string]int64, error)

Uint64(fn ExecFunc) (uint64, error)

Bool(fn ExecFunc) (bool, error)

String(fn ExecFunc) (string, error)

StringMap(fn ExecFunc) (map[string]string, error)

Strings(fn ExecFunc) ([]string, error)

Bytes(fn ExecFunc) ([]byte, error)

ByteSlices(fn ExecFunc) ([][]byte, error)

Positions(fn ExecFunc) ([]*[2]float64, error)

Float64(fn ExecFunc) (float64, error)

Float64s(fn ExecFunc) ([]float64, error)

Values(fn ExecFunc) ([]interface{}, error)

Alone示例
var echoStr = "hello world"
    
var aloneMode = alone.New(
    alone.Addr("192.168.0.110:6379"),
    alone.PoolOpts(
        mode.MaxActive(0),       // 最大连接数,默认0无限制
        mode.MaxIdle(0),         // 最多保持空闲连接数,默认2*runtime.GOMAXPROCS(0)
        mode.Wait(false),        // 连接耗尽时是否等待,默认false
        mode.IdleTimeout(0),     // 空闲连接超时时间,默认0不超时
        mode.MaxConnLifetime(0), // 连接的生命周期,默认0不失效
        mode.TestOnBorrow(nil),  // 空间连接取出后检测是否健康,默认nil
    ),
    alone.DialOpts(
        redis.DialReadTimeout(time.Second),    // 读取超时,默认time.Second
        redis.DialWriteTimeout(time.Second),   // 写入超时,默认time.Second
        redis.DialConnectTimeout(time.Second), // 连接超时,默认500*time.Millisecond
        redis.DialPassword(""),                // 鉴权密码,默认空
        redis.DialDatabase(0),                 // 数据库号,默认0
        redis.DialKeepAlive(time.Minute*5),    // 默认5*time.Minute
        redis.DialNetDial(nil),                // 自定义dial,默认nil
        redis.DialUseTLS(false),               // 是否用TLS,默认false
        redis.DialTLSSkipVerify(false),        // 服务器证书校验,默认false
        redis.DialTLSConfig(nil),              // 默认nil,详见tls.Config
    ),
)

var instance = redigo.New(aloneMode)

res, err := instance.String(func(c redis.Conn) (res interface{}, err error) {
    return c.Do("ECHO", echoStr)
})

if err != nil {
    log.Fatal(err)
} else if res != echoStr {
    log.Fatalf("unexpected result, expect = %s, but = %s", echoStr, res)
}
Sentinel示例
var echoStr = "hello world"
    
var sentinelMode = sentinel.New(
    sentinel.Addrs([]string{"192.168.0.110:26379"}),
    // 这两项配置和Alone模式完全相同
    // sentinel.PoolOpts(...),
    // sentinel.DialOpts(...),
    // 连接哨兵配置,用法于sentinel.DialOpts()一致
    // 默认未配置的情况则直接使用sentinel.DialOpts()的配置
    // sentinel.SentinelDialOpts()
)

var instance = redigo.New(sentinelMode)

res, err := instance.String(func(c redis.Conn) (res interface{}, err error) {
    return c.Do("ECHO", echoStr)
})

if err != nil {
    log.Fatal(err)
} else if res != echoStr {
    log.Fatalf("unexpected result, expect = %s, but = %s", echoStr, res)
}
Cluster示例
var echoStr = "hello world"
    
var clusterMode = cluster.New(
    cluster.Nodes([]string{
        "192.168.0.110:30001", "192.168.0.110:30002", "192.168.0.110:30003",
        "192.168.0.110:30004", "192.168.0.110:30005", "192.168.0.110:30006",
    }),
    // 这两项配置和Alone模式完全相同
    // cluster.PoolOpts(...),
    // cluster.DialOpts(...),
)

var instance = redigo.New(clusterMode)

res, err := instance.String(func(c redis.Conn) (res interface{}, err error) {
    return c.Do("ECHO", echoStr)
})

if err != nil {
    log.Fatal(err)
} else if res != echoStr {
    log.Fatalf("unexpected result, expect = %s, but = %s", echoStr, res)
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/37055.html

相关文章

  • 【独家】终生受用Redis高可用技术解决方案大全

    摘要:哨兵是社区版本推出的原生高可用解决方案,部署架构主要包括两部分集群和数据集群,其中集群是由若干节点组成的分布式集群。自研推荐推荐自研的高可用解决方案,主要体现在配置中心故障探测和的处理机制上,通常需要根据企业业务的实际线上环境来定制化。 最近很多朋友向我咨询关于高可用的方案的优缺点以及如何选择合适的方案线上使用,刚好最近在给宜人贷,光大银行做企业内训的时候也详细讲过,这里我再整理发出来...

    cc17 评论0 收藏0
  • 【独家】终生受用Redis高可用技术解决方案大全

    摘要:哨兵是社区版本推出的原生高可用解决方案,部署架构主要包括两部分集群和数据集群,其中集群是由若干节点组成的分布式集群。自研推荐推荐自研的高可用解决方案,主要体现在配置中心故障探测和的处理机制上,通常需要根据企业业务的实际线上环境来定制化。 最近很多朋友向我咨询关于高可用的方案的优缺点以及如何选择合适的方案线上使用,刚好最近在给宜人贷,光大银行做企业内训的时候也详细讲过,这里我再整理发出来...

    helloworldcoding 评论0 收藏0
  • 【数据库】Redis集群

    摘要:类似代码实现如下从缓存中获取数据缓存为空从存储中获取如果存储数据为空,需要设置一个过期时间秒缓存非空布隆过滤器拦截就类似于一个,用于快速判某个元素是否存在于集合中,其典型的应用场景就是快速判断一个是否存在于某容器,不存在就直接返回。 欢迎关注公众号:【爱编码】如果有需要后台回复2019赠送1T的学习资料哦!! showImg(https://upload-images.jianshu....

    raoyi 评论0 收藏0
  • Redis学习路线

    摘要:入门知识特性使用场景单机安装日常使用五类数据结构的重用命令进阶学习客户端连接池与的结合的持久化事务支持脚本支持管道实现发布订阅高级学习复制集群哨兵机制与哨兵集合数据恢复与转移的阻塞分析实战学习网站排行榜微博点击数时间轴队列实现分布式锁实现统 入门知识 redis特性redis使用场景redis单机安装日常使用五类数据结构redis的重用命令 进阶学习 Redis客户端Redis连接池与...

    tulayang 评论0 收藏0
  • Linux_搭建Redis集群哨兵模式

    时间:2017年08月02日星期三 说明:基于CentOS7-64bit。在单台Linux主机上搭建Redis伪集群哨兵模式。 步骤一:安装Redis 1.下载Redis安装包 Redis官网:https://redis.io/ 下载地址:https://redis.io/download 2.上传Redis安装包 使用ftp工具,将下载好的Redis安装包上传到linux服务器 步骤二:配置文件...

    Ilikewhite 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<