自定义分片插件
我们默认提供了三种分片实现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.ContextSetInstanceIP(string)GetKeyName() stringGetKeyParams() []interface{}GetKey() string}
实现接口
此处我们以simpleHandler 为例,简要说明自定义插件的编写方式
package mainimport ("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 % clusterLeninstance = 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 mainimport("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 {//....}}
