执行set和get命令


xredis对象

当前组件提供了三种分片机制可供选择

  • func NewXesRedisOfCtx(ctx context.Context) *xesRedis //此种方式可以传入自定义插件。如果没有自定义插件则走默认sharding方式, 但此种方式由于历史原因,是一种比较定制化的分片方案,不建议使用
  • func NewSimpleXesRedis(ctx context.Context, instance string) *xesRedis //指定初始化redis instance,fmt格式化生成key(适合指定实例、指定key,接近原生调用)原生redis方案
  • func NewShardingXesRedis(ctx context.Context, cluster string) *xesRedis //默认sharding方式获取redis instance,fmt格式化生成key(适合按key sharding方式)插件化方案 注意阅读下文使用方式

NewSimpleXesRedis

方法NewSimpleXesRedis接受两个参数:ctxinstnce 其中instance 为上一小节中的连接别名

  1. package example
  2. import (
  3. "context"
  4. "github.com/tal-tech/xredis"
  5. "github.com/tal-tech/loggerX"
  6. "time"
  7. )
  8. const (
  9. STAGE_REPORT_PLANDID_STATUS = "stageReportPlanIdStatus_%v"
  10. )
  11. func ExampleSet(ctx context.Context, dateStr, value string) (error) {
  12. xredis := xredis.NewSimpleXesRedis(ctx, "rediscon")
  13. _, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value, 0)
  14. if err != nil {
  15. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  16. return err
  17. }
  18. return nil
  19. }
  20. func ExampleGet(ctx context.Context, dateStr, planId string)(string, error) {
  21. xredis := xredis.NewSimpleXesRedis(ctx, "rediscon")
  22. value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
  23. if err != nil {
  24. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  25. return "", err
  26. }
  27. return value, nil
  28. }

注意

  • 如果存在并发情况,则必须像上述例子那样一个操作New一个redis对象,如果redis实例是单实例,可以不考虑并发问题,如果redis实例是多实例且需要按照规则sharding的话,需要额外注意使用方式

正确使用

  1. package example
  2. import (
  3. "context"
  4. "github.com/tal-tech/xredis"
  5. "github.com/tal-tech/loggerX"
  6. "time"
  7. )
  8. const (
  9. STAGE_REPORT_PLANDID_STATUS = "stageReportPlanIdStatus_%v"
  10. )
  11. func ExampleSet(ctx context.Context, dateStr) (error) {
  12. //sharding场景下需要一次操作创建一个redis实例
  13. xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
  14. _, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value1, 0)
  15. if err != nil {
  16. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  17. return err
  18. }
  19. //sharding场景下需要一次操作创建一个redis实例
  20. xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
  21. _, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value2, 0)
  22. if err != nil {
  23. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  24. return err
  25. }
  26. return nil
  27. }
  28. func ExampleGet(ctx context.Context, dateStr, planId string)(string, error) {
  29. //sharding场景下需要一次操作创建一个redis实例
  30. xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
  31. value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
  32. if err != nil {
  33. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  34. return "", err
  35. }
  36. //sharding场景下需要一次操作创建一个redis实例
  37. xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
  38. value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
  39. if err != nil {
  40. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  41. return "", err
  42. }
  43. return value, nil
  44. }

错误使用

  1. package example
  2. import (
  3. "context"
  4. "github.com/tal-tech/xredis"
  5. "github.com/tal-tech/loggerX"
  6. "time"
  7. )
  8. const (
  9. STAGE_REPORT_PLANDID_STATUS = "stageReportPlanIdStatus_%v"
  10. )
  11. func ExampleSet(ctx context.Context, dateStr) (error) {
  12. xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
  13. _, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value1, 0)
  14. if err != nil {
  15. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  16. return err
  17. }
  18. //sharding场景下这样复用实例对象会把数据写到同一redis实例里,达不到分流效果
  19. _, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value2, 0)
  20. if err != nil {
  21. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  22. return err
  23. }
  24. return nil
  25. }
  26. func ExampleGet(ctx context.Context, dateStr, planId string)(string, error) {
  27. xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
  28. value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
  29. if err != nil {
  30. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  31. return "", err
  32. }
  33. //sharding场景下这样复用实例对象会到同一redis实例里获取数据,导致获取不到
  34. value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
  35. if err != nil {
  36. logger.Ex(ctx, "ExampleSet", "err:%v", err)
  37. return "", err
  38. }
  39. return value, nil
  40. }
  • Set 函数的最后一个参数代表过期时间,0永久;>0 则设置为过期时间,单位为秒

  • 出现错误的第一现场用logger打印日志

  • 当key不存在时,Get方法返回的错误类型为redis.Nil (github.com/go-redis/redis) , 而不是空字符串""

  • 参数SetGet的第二个参数类型为切片类型,这个主要是为了格式化 keyName 时使用,比如我们keyName 可能是形如my_redis_key_%v_%v 带有占位符的字符串, 通过这样的设计使我们的key更通用!