// Copyright 2012 Gary Burd // // Licensed under the Apache License, Version 2.0 (the "License"): you may // not use this file except in compliance with the License. You may obtain // a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the // License for the specific language governing permissions and limitations // under the License. package redis import ( "context" "github.com/bilibili/kratos/pkg/container/pool" xtime "github.com/bilibili/kratos/pkg/time" ) // Error represents an error returned in a command reply. type Error string func (err Error) Error() string { return string(err) } // Config client settings. type Config struct { *pool.Config Name string // redis name, for trace Proto string Addr string Auth string DialTimeout xtime.Duration ReadTimeout xtime.Duration WriteTimeout xtime.Duration SlowLog xtime.Duration } type Redis struct { pool *Pool conf *Config } func NewRedis(c *Config, options ...DialOption) *Redis { return &Redis{ pool: NewPool(c, options...), conf: c, } } // Do gets a new conn from pool, then execute Do with this conn, finally close this conn. // ATTENTION: Don't use this method with transaction command like MULTI etc. Because every Do will close conn automatically, use r.Conn to get a raw conn for this situation. func (r *Redis) Do(ctx context.Context, commandName string, args ...interface{}) (reply interface{}, err error) { conn := r.pool.Get(ctx) defer conn.Close() reply, err = conn.Do(commandName, args...) return } // Close closes connection pool func (r *Redis) Close() error { return r.pool.Close() } // Conn direct gets a connection func (r *Redis) Conn(ctx context.Context) Conn { return r.pool.Get(ctx) } func (r *Redis) Pipeline() (p Pipeliner) { return &pipeliner{ pool: r.pool, } }