执行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 exampleimport ("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 exampleimport ("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 exampleimport ("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更通用!
