自定义分片插件


我们默认提供了三种分片实现defaultHandler.gosimpleHandler.goshardinghandler.go,但是,如果我们有比较个性化的需求,那么在不对redisdao做任何改动的前提下,即可实现一种自定义分片

分片插件接口

  1. type XesRedisHandler interface {
  2. //获取实例别名(与配置文件中的别名是一个概念)
  3. GetInstance(xesRedis core.XesRedisBase) string
  4. //获取真正的redis key(格式化之后)
  5. GetKey(xesRedis core.XesRedisBase) string
  6. }
  7. //xesRedisBase提供方法
  8. type XesRedisBase interface {
  9. GetCtx() context.Context
  10. SetInstanceIP(string)
  11. GetKeyName() string
  12. GetKeyParams() []interface{}
  13. GetKey() string
  14. }

实现接口

此处我们以simpleHandler 为例,简要说明自定义插件的编写方式

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/spf13/cast"
  5. "github.com/tal-tech/redisdao"
  6. )
  7. var (
  8. //redis集群
  9. myRedisCluster = []string{"127.0.0.1:2379", "127.0.0.1:6379"}
  10. )
  11. type simpleHandler struct {
  12. }
  13. func (this *simpleHandler) GetKey(xesRedis core.XesRedisBase) (ret string) {
  14. defer func() {
  15. if xesRedis.GetCtx() == nil {
  16. return
  17. }
  18. bench := xesRedis.GetCtx().Value("IS_BENCHMARK")
  19. if cast.ToString(bench) == "1" {
  20. ret = "benchmark_" + ret
  21. }
  22. }()
  23. ret = fmt.Sprintf(xesRedis.GetKeyName(), (xesRedis.GetKeyParams())...)
  24. return
  25. }
  26. func (this *simpleHandler) GetInstance(xesRedis core.XesRedisBase) (instance string) {
  27. //-----sharding方案 ----
  28. //仅做演示~
  29. keyName := this.GetKey()
  30. keyLen := len(keyName)
  31. clusterLen := len(myRedisCluster)
  32. instanceIndex := keyLen % clusterLen
  33. instance = myRedisCluster[instanceIndex]
  34. //-----sharding方案 ----
  35. xesRedis.SetInstanceIP(this.instance)
  36. return instance
  37. }
  38. //---------------------------------
  39. // 除了基本的接口实现以外,我们还需要一个生成插件实例的方法
  40. //---------------------------------
  41. func NewSimpleHandler() redisdao.XesRedisHandler{
  42. return &simpleHandler{}
  43. }

注意:

  1. 返回的是 XesRedisHandler 接口类型
  2. 方法this.xesRedis.GetKeyParams() 的作用是,获取格式化key所用的参数,对应为redisdao/command.go 文件中所有命令的参数keyParams
  3. this.xesRedis.SetInstanceIP(this.instance) 必要操作,是把实例地址回传给redisdao,后续执行命令会用到!

在项目中使用

  1. package main
  2. import(
  3. "context"
  4. "github.com/tal-tech/redisdao"
  5. )
  6. var (
  7. Redis_Key_For_Test = "releaseTestIds_%v"
  8. )
  9. func main(){
  10. ctx := context.WithValue(context.Background(), "handler", NewSimpleHandler)
  11. xredis := redisdao.NewXesRedisOfCtx(ctx)
  12. if testIds, err := xredis.ZRangeWithScores(Redis_Key_For_Test , []interface{}{2224}, 0, -1); err != nil {
  13. //...
  14. } else {
  15. //....
  16. }
  17. }