基於 gomodule/redigo 的二次封裝,提供 stand-alone
sentinel
cluster
3種部署模式下的統一接口,使得更換 redis
部署模式對業務透明git
Github:https://github.com/letsfire/r...github
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)
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) }
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) }
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) }