执行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
接受两个参数:ctx
,instnce
其中instance 为上一小节中的连接别名
package example
import (
"context"
"github.com/tal-tech/xredis"
"github.com/tal-tech/loggerX"
"time"
)
const (
STAGE_REPORT_PLANDID_STATUS = "stageReportPlanIdStatus_%v"
)
func ExampleSet(ctx context.Context, dateStr, value string) (error) {
xredis := xredis.NewSimpleXesRedis(ctx, "rediscon")
_, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value, 0)
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return err
}
return nil
}
func ExampleGet(ctx context.Context, dateStr, planId string)(string, error) {
xredis := xredis.NewSimpleXesRedis(ctx, "rediscon")
value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return "", err
}
return value, nil
}
注意
- 如果存在并发情况,则必须像上述例子那样一个操作
New
一个redis对象,如果redis实例是单实例,可以不考虑并发问题,如果redis实例是多实例且需要按照规则sharding的话,需要额外注意使用方式
正确使用
package example
import (
"context"
"github.com/tal-tech/xredis"
"github.com/tal-tech/loggerX"
"time"
)
const (
STAGE_REPORT_PLANDID_STATUS = "stageReportPlanIdStatus_%v"
)
func ExampleSet(ctx context.Context, dateStr) (error) {
//sharding场景下需要一次操作创建一个redis实例
xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
_, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value1, 0)
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return err
}
//sharding场景下需要一次操作创建一个redis实例
xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
_, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value2, 0)
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return err
}
return nil
}
func ExampleGet(ctx context.Context, dateStr, planId string)(string, error) {
//sharding场景下需要一次操作创建一个redis实例
xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return "", err
}
//sharding场景下需要一次操作创建一个redis实例
xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return "", err
}
return value, nil
}
错误使用
package example
import (
"context"
"github.com/tal-tech/xredis"
"github.com/tal-tech/loggerX"
"time"
)
const (
STAGE_REPORT_PLANDID_STATUS = "stageReportPlanIdStatus_%v"
)
func ExampleSet(ctx context.Context, dateStr) (error) {
xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
_, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value1, 0)
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return err
}
//sharding场景下这样复用实例对象会把数据写到同一redis实例里,达不到分流效果
_, err := xredis.Set(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr}, value2, 0)
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return err
}
return nil
}
func ExampleGet(ctx context.Context, dateStr, planId string)(string, error) {
xredis := xredis.NewShardingXesRedis(ctx, "rediscon")
value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return "", err
}
//sharding场景下这样复用实例对象会到同一redis实例里获取数据,导致获取不到
value, err := xredis.Get(STAGE_REPORT_PLANDID_STATUS, []interface{}{dateStr})
if err != nil {
logger.Ex(ctx, "ExampleSet", "err:%v", err)
return "", err
}
return value, nil
}
Set 函数的最后一个参数代表过期时间,0永久;>0 则设置为过期时间,单位为秒
出现错误的第一现场用logger打印日志
当key不存在时,
Get
方法返回的错误类型为redis.Nil
(github.com/go-redis/redis) , 而不是空字符串""
参数
Set
和Get
的第二个参数类型为切片类型,这个主要是为了格式化 keyName 时使用,比如我们keyName 可能是形如my_redis_key_%v_%v
带有占位符的字符串, 通过这样的设计使我们的key更通用!