自定义分片插件
我们默认提供了三种分片实现defaultHandler.go
、 simpleHandler.go
、shardinghandler.go
,但是,如果我们有比较个性化的需求,那么在不对redisdao做任何改动的前提下,即可实现一种自定义分片
分片插件接口
type XesRedisHandler interface {
//获取实例别名(与配置文件中的别名是一个概念)
GetInstance(xesRedis core.XesRedisBase) string
//获取真正的redis key(格式化之后)
GetKey(xesRedis core.XesRedisBase) string
}
//xesRedisBase提供方法
type XesRedisBase interface {
GetCtx() context.Context
SetInstanceIP(string)
GetKeyName() string
GetKeyParams() []interface{}
GetKey() string
}
实现接口
此处我们以simpleHandler
为例,简要说明自定义插件的编写方式
package main
import (
"fmt"
"github.com/spf13/cast"
"github.com/tal-tech/redisdao"
)
var (
//redis集群
myRedisCluster = []string{"127.0.0.1:2379", "127.0.0.1:6379"}
)
type simpleHandler struct {
}
func (this *simpleHandler) GetKey(xesRedis core.XesRedisBase) (ret string) {
defer func() {
if xesRedis.GetCtx() == nil {
return
}
bench := xesRedis.GetCtx().Value("IS_BENCHMARK")
if cast.ToString(bench) == "1" {
ret = "benchmark_" + ret
}
}()
ret = fmt.Sprintf(xesRedis.GetKeyName(), (xesRedis.GetKeyParams())...)
return
}
func (this *simpleHandler) GetInstance(xesRedis core.XesRedisBase) (instance string) {
//-----sharding方案 ----
//仅做演示~
keyName := this.GetKey()
keyLen := len(keyName)
clusterLen := len(myRedisCluster)
instanceIndex := keyLen % clusterLen
instance = myRedisCluster[instanceIndex]
//-----sharding方案 ----
xesRedis.SetInstanceIP(this.instance)
return instance
}
//---------------------------------
// 除了基本的接口实现以外,我们还需要一个生成插件实例的方法
//---------------------------------
func NewSimpleHandler() redisdao.XesRedisHandler{
return &simpleHandler{}
}
注意:
- 返回的是
XesRedisHandler
接口类型 - 方法
this.xesRedis.GetKeyParams()
的作用是,获取格式化key所用的参数,对应为redisdao/command.go
文件中所有命令的参数keyParams
this.xesRedis.SetInstanceIP(this.instance)
必要操作,是把实例地址回传给redisdao,后续执行命令会用到!
在项目中使用
package main
import(
"context"
"github.com/tal-tech/redisdao"
)
var (
Redis_Key_For_Test = "releaseTestIds_%v"
)
func main(){
ctx := context.WithValue(context.Background(), "handler", NewSimpleHandler)
xredis := redisdao.NewXesRedisOfCtx(ctx)
if testIds, err := xredis.ZRangeWithScores(Redis_Key_For_Test , []interface{}{2224}, 0, -1); err != nil {
//...
} else {
//....
}
}