diff --git a/redis.go b/redis.go index c612088356b247fac53dbb23e5dc052cc5fc30b6..caea7f9320e2204471e540652027384e7e4a9b16 100644 --- a/redis.go +++ b/redis.go @@ -5,14 +5,17 @@ import ( "log" + "fmt" + + "strings" + "github.com/garyburd/redigo/redis" ) //NewRedisConn 返回一个新的redis连接 -func NewRedisConn(u string, writeable bool) *RedisConn { - return &RedisConn{ +func NewRedisConn(u string, params ...interface{}) *RedisConn { + return &RedisClient{ u: u, - w: writeable, p: &redis.Pool{ MaxActive: 200, MaxIdle: 50, @@ -29,205 +32,864 @@ func NewRedisConn(u string, writeable bool) *RedisConn { } //RedisClient redis连接 -type RedisClient = RedisConn +type RedisConn = RedisClient //NewRedisClient 返回一个新的redis连接 -func NewRedisClient(u string, writeable bool) *RedisClient { - return NewRedisConn(u, writeable) +func NewRedisClient(u string, params ...interface{}) *RedisClient { + return NewRedisConn(u, params...) } -//RedisConn redis连接 -// -//deprecated use RedisClient instead -type RedisConn struct { +//RedisClient redis连接 +type RedisClient struct { u string //连接URL - w bool //可写? p *redis.Pool } //Do 执行命令 -func (c RedisConn) Do(command string, args ...interface{}) (interface{}, error) { +func (c RedisClient) Do(command string, args ...interface{}) (interface{}, error) { conn := c.p.Get() defer conn.Close() return conn.Do(command, args...) } -func (c RedisConn) panicWrite() { - if !c.w { - log.Panicf("redis conn{%s} is not writeable", c.u) - } -} - //----KEY---- -func (c RedisConn) Del(key string) bool { - c.panicWrite() - +func (c RedisClient) Del(key interface{}) bool { if r, e := redis.Int(c.Do("DEL", key)); e != nil { + log.Printf("DEL %v err: %s", key, e) return false } else { return r >= 0 } } -func (c RedisConn) Dump(key string) (string, error) { - return redis.String(c.Do("DUMP", key)) +func (c RedisClient) Dump(key interface{}) (string, error) { + r, e := redis.String(c.Do("DUMP", key)) + if e != nil { + log.Printf("DUMP %v err: %s", key, e) + return "", e + } else { + return r, nil + } } -func (c RedisConn) Exists(key string) bool { +func (c RedisClient) Exists(key interface{}) bool { if r, e := redis.Int(c.Do("EXISTS", key)); e != nil { + log.Printf("EXISTS %v err: %s", key, e) return false } else { return r == 1 } } -func (c RedisConn) Expire(key string, seconds int64) bool { - c.panicWrite() - +func (c RedisClient) Expire(key interface{}, seconds int64) bool { if r, e := redis.Int(c.Do("EXPIRE", key, seconds)); e != nil { + log.Printf("EXPIRE %v %d err: %s", key, seconds, e) return false } else { return r == 1 } } -func (c RedisConn) ExpireAt(key string, timestamp int64) bool { - c.panicWrite() - +func (c RedisClient) ExpireAt(key interface{}, timestamp int64) bool { if r, e := redis.Int(c.Do("EXPIREAT", key, timestamp)); e != nil { + log.Printf("EXPIREAT %v %d err: %s", key, timestamp, e) return false } else { return r == 1 } } -//----KEY---- +func (c RedisClient) PExpire(key interface{}, milliSeconds int64) bool { + if r, e := redis.Int(c.Do("PEXPIREAT", key, milliSeconds)); e != nil { + log.Printf("PEXPIRE %v %d err: %s", key, milliSeconds, e) + return false + } else { + return r == 1 + } +} -func (c RedisConn) MGet(keys ...string) ([]string, error) { - args := make([]interface{}, 0) - for _, k := range keys { - args = append(args, k) +func (c RedisClient) PExpireAt(key interface{}, timestamp int64) bool { + if r, e := redis.Int(c.Do("PEXPIREAT", key, timestamp)); e != nil { + log.Printf("PEXPIREAT %v %d err: %s", key, timestamp, e) + return false + } else { + return r == 1 } - return redis.Strings(c.Do("MGET", args...)) } -func (c RedisConn) Get(key string) (string, error) { - return redis.String(c.Do("GET", key)) +func (c RedisClient) Keys(pattern interface{}) ([]string, error) { + r, e := redis.Strings(c.Do("KEYS", pattern)) + if e != nil { + log.Printf("KEYS %v err: %s", pattern, e) + return nil, e + } else { + return r, nil + } } -func (c RedisConn) MSet(kvPairs [][2]interface{}) bool { - c.panicWrite() +func (c RedisClient) Move(key interface{}, db int) bool { + if r, e := redis.Int(c.Do("MOVE", key, db)); e != nil { + log.Printf("MOVE %v %d err: %s", key, db, e) + return false + } else { + return r == 1 + } +} - args := make([]interface{}, 0) - for _, pair := range kvPairs { - args = append(args, pair[:]...) +func (c RedisClient) Persist(key interface{}) bool { + if r, e := redis.Int(c.Do("PERSIST", key)); e != nil { + log.Printf("PERSIST %v err: %s", key, e) + return false + } else { + return r == 1 } - re, e := redis.String(c.Do("MSET", args...)) +} + +func (c RedisClient) PTTL(key interface{}) (int64, error) { + r, e := redis.Int64(c.Do("PTTL", key)) if e != nil { + log.Printf("PTTL %v err: %s", key, e) + return r, e + } + switch r { + case -2: + return r, fmt.Errorf("%v is not exist", key) + case -1: + return r, fmt.Errorf("%v does not have expire time", key) + default: + return r, nil + } +} + +func (c RedisClient) TTL(key interface{}) (int64, error) { + r, e := redis.Int64(c.Do("TTL", key)) + if e != nil { + log.Printf("TTL %v err: %s", key, e) + return r, e + } + switch r { + case -2: + return r, fmt.Errorf("%v is not exist", key) + case -1: + return r, fmt.Errorf("%v does not have expire time", key) + default: + return r, nil + } +} + +func (c RedisClient) RandomKey() (string, error) { + if r, e := redis.String(c.Do("RANDOMKEY")); e != nil { + log.Printf("RANDOMKEY err: %s", e) + return r, e + } else { + return r, nil + } +} + +func (c RedisClient) Rename(oldKey, newKey interface{}) bool { + if r, e := redis.String(c.Do("RENAME", oldKey, newKey)); e != nil { + log.Printf("RENAME %v %v err: %s", oldKey, newKey, e) return false + } else { + if strings.ToUpper(r) != "OK" { + log.Printf("RENAME %v %v err: %s", oldKey, newKey, r) + return false + } + + return true + } +} + +func (c RedisClient) RenameNX(oldKey, newKey interface{}) bool { + if r, e := redis.Int(c.Do("RENAMENX", oldKey, newKey)); e != nil { + log.Printf("RENAMENX %v %v err: %s", oldKey, newKey, e) + return false + } else { + return r == 1 } - return re == "OK" } -func (c RedisConn) RPush(key string, values ...interface{}) (int64, error) { - c.panicWrite() +type Type = string - args := make([]interface{}, 0) - args = append(args, key) - args = append(args, values...) - return redis.Int64(c.Do("RPUSH", args...)) +const ( + None Type = "none" + String = "string" + List = "list" + Set = "set" + ZSet = "zset" + Hash = "hash" +) + +func (c RedisClient) Type(key interface{}) (Type, error) { + if r, e := redis.String(c.Do("TYPE", key)); e != nil { + log.Printf("TYPE %v err: %s", key, e) + return None, e + } else { + return r, nil + } } -func (c RedisConn) Set(key string, value string) bool { - c.panicWrite() +//----KEY---- + +//----STRING---- - if reply, err := redis.String(c.Do("SET", key, value)); err != nil { +func (c RedisClient) Set(key interface{}, value interface{}) bool { + if r, e := redis.String(c.Do("SET", key, value)); e != nil { + log.Printf("SET %v %v err: %s", key, value, e) return false } else { - return reply == "OK" + return r == "OK" + } +} + +func (c RedisClient) Get(key interface{}) (r string, e error) { + if r, e = redis.String(c.Do("GET", key)); e != nil { + log.Printf("GET %v err: %s", key, e) } + + return } -func (c RedisConn) HDel(key string, fields ...interface{}) bool { - c.panicWrite() +func (c RedisClient) GetRange(key interface{}, start, end int) (r string, e error) { + if r, e = redis.String(c.Do("GETRANGE", key, start, end)); e != nil { + log.Printf("GETRANGE %v %d %d err: %s", key, start, end, e) + } + + return +} +func (c RedisClient) GetSet(key, value interface{}) (r string, e error) { + r, e = redis.String(c.Do("GETSET", key, value)) + if e != nil { + log.Printf("GETSET %v %v err: %s", key, value, e) + } + + return +} + +func (c RedisClient) GetBit(key interface{}, offset int) (r int, e error) { + r, e = redis.Int(c.Do("GETBIT", key, offset)) + if e != nil { + log.Printf("GETBIT %v %d err: %s", key, offset, e) + } + + return +} + +func (c RedisClient) MGet(keys ...interface{}) ([]string, error) { + r, e := redis.Strings(c.Do("MGET", keys...)) + if e != nil { + log.Printf("MGET %v err: %s", keys, e) + } + + return r, e +} + +func (c RedisClient) SetBit(key interface{}, offset int, bit int) (r int, e error) { + r, e = redis.Int(c.Do("SETBIT", key, offset, bit)) + if e != nil { + log.Printf("SETBIT %v %d %d err: %s", key, offset, bit, e) + } + + return +} + +func (c RedisClient) SetEX(key, value interface{}, seconds int64) bool { + r, e := redis.String(c.Do("SETEX", key, seconds, value)) + if e != nil { + log.Printf("SETEX %v %d %v err: %s", key, seconds, value, e) + return false + } + + return r == "OK" +} + +func (c RedisClient) SetNX(key, value interface{}) bool { + r, e := redis.Int(c.Do("SETNX", key, value)) + if e != nil { + log.Printf("SETNX %v %v err: %s", key, value, e) + return false + } + + return r == 1 +} + +func (c RedisClient) SetRange(key, value interface{}, offset int) (r int, e error) { + r, e = redis.Int(c.Do("SETRANGE", key, offset, value)) + if e != nil { + log.Printf("SETRANGE %v %d %v err: %s", key, offset, value, e) + } + + return +} + +func (c RedisClient) StrLen(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("STRLEN", key)) + if e != nil { + log.Printf("STRLEN %v err: %s", key, e) + } + + return +} + +func (c RedisClient) MSet(pairs [][2]interface{}) bool { + args := make([]interface{}, len(pairs)*2) + for i, pair := range pairs { + args[2*i] = pair[0] + args[2*i+1] = pair[1] + } + + r, e := redis.String(c.Do("MSET", args...)) + if e != nil { + log.Printf("MSET %v err: %s", pairs, e) + return false + } + + return r == "OK" +} + +func (c RedisClient) MSetNX(pairs [][2]interface{}) bool { + args := make([]interface{}, len(pairs)*2) + for i, pair := range pairs { + args[i*2] = pair[0] + args[i*2+1] = pair[1] + } + + r, e := redis.Int(c.Do("MSETNX", args...)) + if e != nil { + log.Printf("MSETNX %v err: %s", pairs, e) + return false + } + + return r == 1 +} + +func (c RedisClient) PSetEX(key, value interface{}, milliSeconds int64) bool { + r, e := redis.String(c.Do("PSETEX", key, milliSeconds, value)) + if e != nil { + log.Printf("PSETEX %v %d %v err: %s", key, milliSeconds, value, e) + } + + return r == "OK" +} + +func (c RedisClient) Incr(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("INCR", key)) + if e != nil { + log.Printf("INCR %v err: %s", key, e) + } + + return +} + +func (c RedisClient) IncrBy(key interface{}, incrAmount int64) (r int, e error) { + r, e = redis.Int(c.Do("INCRBY", key, incrAmount)) + if e != nil { + log.Printf("INCRBY %v %d err: %s", key, incrAmount, e) + } + + return +} + +func (c RedisClient) IncrByFloat(key interface{}, incrAmount float64) (r float64, e error) { + r, e = redis.Float64(c.Do("INCRBYFLOAT", key, incrAmount)) + if e != nil { + log.Printf("INCRBYFLOAT %v %f err: %s", key, incrAmount, e) + } + + return +} + +func (c RedisClient) Decr(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("Decr", key)) + if e != nil { + log.Printf("Decr %v err: %s", key, e) + } + + return +} + +func (c RedisClient) DecrBy(key interface{}, incrAmount int64) (r int, e error) { + r, e = redis.Int(c.Do("DecrBy", key, incrAmount)) + if e != nil { + log.Printf("DecrBy %v %d err: %s", key, incrAmount, e) + } + + return +} + +func (c RedisClient) Append(key, value interface{}) (r int, e error) { + r, e = redis.Int(c.Do("APPEND", key, value)) + if e != nil { + log.Printf("APPEND %v %v err: %s", key, value, e) + } + + return +} + +//----STRING---- + +//----HASH---- + +func (c RedisClient) HDel(key interface{}, fields ...interface{}) bool { args := []interface{}{key} args = append(args, fields...) + if count, e := redis.Int(c.Do("HDEL", args...)); e != nil { + log.Printf("HDEL %v %v err: %s", key, fields, e) return false } else { return count >= 0 } } -func (c RedisConn) HExists(key, field string) (bool, error) { - return redis.Bool(c.Do("HEXISTS", key, field)) +func (c RedisClient) HExists(key, field interface{}) bool { + r, e := redis.Bool(c.Do("HEXISTS", key, field)) + if e != nil { + log.Printf("HEXISTS %v %v err: %s", key, field, e) + } + + return r } -func (c RedisConn) HGet(key, field string) (string, error) { - return redis.String(c.Do("HGET", key, field)) +func (c RedisClient) HGet(key, field interface{}) (r string, e error) { + r, e = redis.String(c.Do("HGET", key, field)) + if e != nil { + log.Printf("HGET %v %v err: %s", key, field, e) + } + + return } -func (c RedisConn) HGetAll(key string) (map[string]string, error) { - return redis.StringMap(c.Do("HGETALL", key)) +func (c RedisClient) HGetAll(key interface{}) (r map[string]string, e error) { + r, e = redis.StringMap(c.Do("HGETALL", key)) + if e != nil { + log.Printf("HGETALL %v err: %s", key, e) + } + + return } -func (c RedisConn) HIncrBy(key, field string, incr int64) (int64, error) { - c.panicWrite() +func (c RedisClient) HIncrBy(key, field interface{}, incr int64) (r int64, e error) { + r, e = redis.Int64(c.Do("HINCRBY", key, field, incr)) + if e != nil { + log.Printf("HINCRBY %v %v %d err: %s", key, field, incr, e) + } - return redis.Int64(c.Do("HINCRBY", key, field, incr)) + return } -func (c RedisConn) HIncrByFloat(key, field string, incr float64) (float64, error) { - c.panicWrite() +func (c RedisClient) HIncrByFloat(key, field interface{}, incr float64) (r float64, e error) { + r, e = redis.Float64(c.Do("HINCRBYFLOAT", key, field, incr)) + if e != nil { + log.Printf("HINCRBYFLOAT %v %v %f err: %s", key, field, incr, e) + } - return redis.Float64(c.Do("HINCRBYFLOAT", key, field, incr)) + return } -func (c RedisConn) HKeys(key string) ([]string, error) { - return redis.Strings(c.Do("HKEYS", key)) +func (c RedisClient) HKeys(key interface{}) (r []string, e error) { + r, e = redis.Strings(c.Do("HKEYS", key)) + if e != nil { + log.Printf("HKEYS %v err: %s", key, e) + } + + return } -func (c RedisConn) HLen(key string) (int, error) { - return redis.Int(c.Do("HLEN", key)) +func (c RedisClient) HLen(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("HLEN", key)) + if e != nil { + log.Printf("HLEN %v err: %s", key, e) + } + + return } -func (c RedisConn) HMGet(key string, fields ...interface{}) ([]interface{}, error) { +func (c RedisClient) HMGet(key interface{}, fields ...interface{}) (r []string, e error) { args := []interface{}{key} args = append(args, fields...) - return redis.Values(c.Do("HMGET", args...)) -} + r, e = redis.Strings(c.Do("HMGET", args...)) + if e != nil { + log.Printf("HMGET %v %v err: %s", key, fields, e) + } -func (c RedisConn) HMSet(key string, fieldValues ...map[string]interface{}) bool { - c.panicWrite() + return +} - args := []interface{}{key} - for i := range fieldValues { - for k, v := range fieldValues[i] { - args = append(args, k) - args = append(args, v) - } +func (c RedisClient) HMSet(key interface{}, pairs [][2]interface{}) bool { + args := make([]interface{}, 1+len(pairs)*2) + args[0] = key + for i, pair := range pairs { + args[1+2*i] = pair[0] + args[2+2*i] = pair[1] } + if r, e := redis.String(c.Do("HMSET", args...)); e != nil { + log.Printf("HMSET %v %v err: %s", key, pairs, e) return false } else { return r == "OK" } } -func (c RedisConn) HSet(key, field string, value string) bool { - c.panicWrite() +func (c RedisClient) HSet(key, field, value interface{}) bool { + r, e := redis.Int(c.Do("HSET", key, field, value)) + if e != nil { + log.Printf("HSET %v %v %v err: %s", key, field, value, e) + return false + } + + return r >= 0 +} + +func (c RedisClient) HSetNX(key, field, value interface{}) bool { + r, e := redis.Int(c.Do("HSETNX", key, field, value)) + if e != nil { + log.Printf("HSETNX %v %v %v err: %s", key, field, value, e) + return false + } + + return r == 1 +} + +func (c RedisClient) HVals(key interface{}) (r []string, e error) { + r, e = redis.Strings(c.Do("HVALS", key)) + if e != nil { + log.Printf("HVALS %v err: %s", key, e) + } + + return +} + +//----HASH---- + +//----LIST---- + +func (c RedisClient) LIndex(key interface{}, pos int) (r string, e error) { + r, e = redis.String(c.Do("LINDEX", key, pos)) + if e != nil { + log.Printf("LINDEX %v %d err: %s", key, pos, e) + } + + return +} + +func (c RedisClient) LPush(key interface{}, values ...interface{}) (r int, e error) { + args := []interface{}{key} + args = append(args, values...) + r, e = redis.Int(c.Do("LPUSH", args...)) + if e != nil { + log.Printf("LPUSH %v %v err: %s", key, values, e) + } + + return +} + +func (c RedisClient) LRange(key interface{}, start, end int) (r []string, e error) { + r, e = redis.Strings(c.Do("LRANGE", key, start, end)) + if e != nil { + log.Printf("LRANGE %v %d %d err: %s", key, start, end, e) + } + + return +} + +func (c RedisClient) RPush(key interface{}, values ...interface{}) (r int64, e error) { + args := []interface{}{key} + args = append(args, values...) + r, e = redis.Int64(c.Do("RPUSH", args...)) + if e != nil { + log.Printf("RPUSH %v %v err: %s", key, values, e) + } + + return +} + +func (c RedisClient) LLen(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("LLEN", key)) + if e != nil { + log.Printf("LLEN %v err: %s", key, e) + } + + return +} + +func (c RedisClient) LPop(key interface{}) (r string, e error) { + r, e = redis.String(c.Do("LPOP", key)) + if e != nil { + log.Printf("LPOP %v err: %s", key, e) + } + + return +} + +func (c RedisClient) LSet(key, value interface{}, pos int) bool { + r, e := redis.String(c.Do("LSET", key, pos, value)) + if e != nil { + log.Printf("LSET %v %d %v err: %s", key, pos, value, e) + } + + return r == "OK" +} + +func (c RedisClient) RPop(key interface{}) (r string, e error) { + r, e = redis.String(c.Do("RPOP", key)) + if e != nil { + log.Printf("RPOP %v err: %s", key, e) + } + + return +} + +//----LIST---- + +//----SET---- + +func (c RedisClient) SAdd(key interface{}, values ...interface{}) (r int, e error) { + args := []interface{}{key} + args = append(args, values...) + r, e = redis.Int(c.Do("SADD", args...)) + if e != nil { + log.Printf("SADD %v %v err: %s", key, values, e) + } + + return +} + +func (c RedisClient) SCard(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("SCARD", key)) + if e != nil { + log.Printf("SCARD %v err: %s", key, e) + } + + return +} + +func (c RedisClient) SDiff(keys ...interface{}) (r []string, e error) { + r, e = redis.Strings(c.Do("SDIFF", keys...)) + if e != nil { + log.Printf("SDIFF %v err: %s", keys, e) + } + + return +} + +func (c RedisClient) SDiffStore(dest interface{}, keys ...interface{}) (r int, e error) { + args := []interface{}{dest} + args = append(args, keys...) + r, e = redis.Int(c.Do("SDIFFSTORE", args...)) + if e != nil { + log.Printf("SDIFFSTORE %v %v err: %s", dest, keys, e) + } + + return +} + +func (c RedisClient) SMembers(key interface{}) (r []string, e error) { + r, e = redis.Strings(c.Do("SMEMBERS", key)) + if e != nil { + log.Printf("SMEMBERS %v err: %s", key, e) + } + return +} + +func (c RedisClient) SInter(keys ...interface{}) (r []string, e error) { + r, e = redis.Strings(c.Do("SINTER", keys...)) + if e != nil { + log.Printf("SINTER %v err: %s", keys, e) + } + return +} + +func (c RedisClient) SInterStore(dest interface{}, keys ...interface{}) (r int, e error) { + args := []interface{}{dest} + args = append(args, keys...) + r, e = redis.Int(c.Do("SINTERSTORE", args...)) + if e != nil { + log.Printf("SINTERSTORE %v %v err: %s", dest, keys, e) + } + + return +} + +func (c RedisClient) SIsMember(key, value interface{}) bool { + r, e := redis.Bool(c.Do("SISMEMBER", key, value)) + if e != nil { + log.Printf("SISMEMBER %v %v err: %s", key, value, e) + } + return r +} + +func (c RedisClient) SPop(key interface{}) (r string, e error) { + r, e = redis.String(c.Do("SPOP", key)) + if e != nil { + log.Printf("SPOP %v err: %s", key, e) + } + return +} - _, e := c.Do("HSET", key, field, value) - return e == nil +func (c RedisClient) SPopN(key interface{}, n int) (r []string, e error) { + r, e = redis.Strings(c.Do("SPOP", key, n)) + if e != nil { + log.Printf("SPOP %v %d err: %s", key, n, e) + } + return } -func (c RedisConn) HVals(key string) ([]interface{}, error) { - return redis.Values(c.Do("HVALS", key)) +func (c RedisClient) SRandMember(key interface{}) (r string, e error) { + r, e = redis.String(c.Do("SRANDMEMBER", key)) + if e != nil { + log.Printf("SRANDMEMBER %v err: %s", key, e) + } + return } -func (c RedisConn) Keys(key string) ([]string, error) { - return redis.Strings(c.Do("KEYS", key)) +func (c RedisClient) SRandMemberN(key interface{}, n int) (r []string, e error) { + r, e = redis.Strings(c.Do("SRANDMEMBER", key, n)) + if e != nil { + log.Printf("SRANDMEMBER %v %d err: %s", key, n, e) + } + return +} + +func (c RedisClient) SRem(key interface{}, members ...interface{}) (r int, e error) { + args := []interface{}{key} + args = append(args, members...) + r, e = redis.Int(c.Do("SREM", args...)) + if e != nil { + log.Printf("SREM %v %v err: %s", key, members, e) + } + return +} + +func (c RedisClient) SUnion(keys ...interface{}) (r []string, e error) { + r, e = redis.Strings(c.Do("SUNION", keys...)) + if e != nil { + log.Printf("SUNION %v err: %s", keys, e) + } + return +} + +func (c RedisClient) SUnionStore(dest interface{}, keys ...interface{}) (r int, e error) { + args := []interface{}{dest} + args = append(args, keys...) + r, e = redis.Int(c.Do("SUNIONSTORE", args...)) + if e != nil { + log.Printf("SUNIONSTORE %v err: %s", args, e) + } + return +} + +//----SET---- + +//----SORTED SET---- + +func (c RedisClient) ZAdd(key interface{}, pairs [][2]interface{}) (r int, e error) { + args := make([]interface{}, 1+2*len(pairs)) + args[0] = key + for i, pair := range pairs { + args[1+2*i] = pair[0] + args[2+2*i] = pair[1] + } + + r, e = redis.Int(c.Do("ZADD", args...)) + if e != nil { + log.Printf("ZADD %v %v err: %s", key, pairs, e) + } + return } + +func (c RedisClient) ZCard(key interface{}) (r int, e error) { + r, e = redis.Int(c.Do("ZCARD", key)) + if e != nil { + log.Printf("ZCARD %v err: %s", key, e) + } + return +} + +func (c RedisClient) ZRange(key interface{}, start, stop int) (r []string, e error) { + r, e = redis.Strings(c.Do("ZRANGE", key, start, stop)) + if e != nil { + log.Printf("ZRANGE %v %d %d err: %s", key, start, stop, e) + } + return +} + +func (c RedisClient) ZRangeWithScores(key interface{}, start, stop int) (r map[string]string, e error) { + r, e = redis.StringMap(c.Do("ZRANGE", key, start, stop, "WITHSCORES")) + if e != nil { + log.Printf("ZRANGE %v %d %d WITHSCORES err: %s", key, start, stop, e) + } + return +} + +func (c RedisClient) ZCount(key interface{}, min, max float64) (r int, e error) { + r, e = redis.Int(c.Do("ZCOUNT", key, min, max)) + if e != nil { + log.Printf("ZCOUNT %v %f %f err: %s", key, min, max, e) + } + return +} + +func (c RedisClient) ZIncrBy(key, member interface{}, incr float64) (r float64, e error) { + r, e = redis.Float64(c.Do("ZINCRBY", key, incr, member)) + if e != nil { + log.Printf("ZINCRBY %v %f %v err: %s", key, incr, member, e) + } + return +} + +func (c RedisClient) ZRank(key, member interface{}) (r int, e error) { + r, e = redis.Int(c.Do("ZRANK", key, member)) + if e != nil { + log.Printf("ZRANK %v %v err: %s", key, member, e) + } + return +} + +func (c RedisClient) ZRevRank(key, member interface{}) (r int, e error) { + r, e = redis.Int(c.Do("ZREVRANK", key, member)) + if e != nil { + log.Printf("ZREVRANK %v %v err: %s", key, member, e) + } + return +} + +func (c RedisClient) ZRem(key interface{}, members ...interface{}) (r int, e error) { + args := []interface{}{key} + args = append(args, members...) + r, e = redis.Int(c.Do("ZREM", args...)) + if e != nil { + log.Printf("ZREM %v %v err: %s", key, members, e) + } + return +} + +func (c RedisClient) ZRevRange(key interface{}, start, stop int) (r []string, e error) { + r, e = redis.Strings(c.Do("ZREVRANGE", key, start, stop)) + if e != nil { + log.Printf("ZREVRANGE %v %d %d err: %s", key, start, stop, e) + } + return +} + +func (c RedisClient) ZRevRangeWithScores(key interface{}, start, stop int) (r map[string]string, e error) { + r, e = redis.StringMap(c.Do("ZREVRANGE", key, start, stop, "WITHSCORES")) + if e != nil { + log.Printf("ZREVRANGE %v %d %d WITHSCORES err: %s", key, start, stop, e) + } + return +} + +func (c RedisClient) ZScore(key, member interface{}) (r float64, e error) { + r, e = redis.Float64(c.Do("ZSCORE", key, member)) + if e != nil { + log.Printf("ZSCORE %v %v err: %s", key, member, e) + } + return +} + +//----SORTED SET---- diff --git a/redis_test.go b/redis_test.go new file mode 100644 index 0000000000000000000000000000000000000000..1dfaa68db2840f6d08c6de76d458cfbd66da111d --- /dev/null +++ b/redis_test.go @@ -0,0 +1,511 @@ +package helper + +import "testing" + +var test = NewRedisClient("redis://192.168.10.99/1") + +func TestRedisClient_Get(t *testing.T) { + t.Log(test.Set("key", "value")) + t.Log(test.Get("key")) + t.Log(test.Set("key", "new-value")) + t.Log(test.Get("key")) + + test.Del("key") +} + +func TestRedisClient_MGet(t *testing.T) { + t.Log(test.MGet("123", "12", "1", "2")) + t.Log(test.MGet("a")) +} + +func TestRedisClient_SetBit(t *testing.T) { + t.Log(test.SetBit("bit", 10086, 1)) + t.Log(test.GetBit("bit", 10086)) + t.Log(test.GetBit("bit", 100)) + + test.Del("bit") +} + +func TestRedisClient_SetEX(t *testing.T) { + t.Log(test.SetEX("mykey", "redis", 60)) + t.Log(test.TTL("mykey")) + t.Log(test.Get("mykey")) + + test.Del("mykey") +} + +func TestRedisClient_SetNX(t *testing.T) { + t.Log(test.Exists("job")) + t.Log(test.SetNX("job", "programmer")) + t.Log(test.SetNX("job", "code-farmer")) + t.Log(test.Get("job")) + + test.Del("job") +} + +func TestRedisClient_SetRange(t *testing.T) { + t.Log(test.Set("key1", "Hello World")) + t.Log(test.SetRange("key1", "Redis", 6)) + t.Log(test.Get("key1")) + + test.Del("key1") +} + +func TestRedisClient_StrLen(t *testing.T) { + t.Log(test.Set("mykey", "Hello World")) + t.Log(test.StrLen("mykey")) + + test.Del("mykey") + t.Log(test.StrLen("mykey")) +} + +func TestRedisClient_MSet(t *testing.T) { + t.Log(test.MSet([][2]interface{}{ + {"key1", "Hello"}, + {"key2", "World"}, + })) + + t.Log(test.Get("key1")) + t.Log(test.Get("key2")) + + test.Del("key1") + test.Del("key2") +} + +func TestRedisClient_MSetNX(t *testing.T) { + t.Log(test.MSetNX([][2]interface{}{ + {"rmdbs", "MySql"}, + {"nosql", "MongoDB"}, + {"key-value-store", "redis"}, + })) + + t.Log(test.MGet("rmdbs", "nosql", "key-value-store")) + + t.Log(test.MSetNX([][2]interface{}{ + {"rmdbs", "Sqlite"}, + {"language", "python"}, + })) + t.Log(test.Exists("language")) + t.Log(test.Get("rmdbs")) + + test.Del("rmdbs") + test.Del("nosql") + test.Del("key-value-store") +} + +func TestRedisClient_PSetEX(t *testing.T) { + t.Log(test.PSetEX("mykey", "Hello", 1000)) + t.Log(test.PTTL("mykey")) + t.Log(test.Get("mykey")) + + test.Del("mykey") +} + +func TestRedisClient_Incr(t *testing.T) { + t.Log(test.Set("page_view", "20")) + t.Log(test.Incr("page_view")) + t.Log(test.Get("page_view")) + + t.Log(test.Set("page_view", "NaN")) + t.Log(test.Incr("page_view")) + t.Log(test.Get("page_view")) + + test.Del("page_view") +} + +func TestRedisClient_IncrBy(t *testing.T) { + t.Log(test.Set("rank", "50")) + t.Log(test.IncrBy("rank", 20)) + t.Log(test.Get("rank")) + test.Del("rank") + + t.Log(test.Exists("rank")) + t.Log(test.IncrBy("rank", 30)) + t.Log(test.Get("rank")) + + t.Log(test.Set("rank", "NaN")) + t.Log(test.IncrBy("rank", 200)) + t.Log(test.Get("rank")) + + test.Del("rank") +} + +func TestRedisClient_IncrByFloat(t *testing.T) { + t.Log(test.Set("k", "10.50")) + t.Log(test.IncrByFloat("k", 0.1)) + + t.Log(test.Set("k", "314e-2")) + t.Log(test.IncrByFloat("k", 0)) + + t.Log(test.Set("k", "3")) + t.Log(test.IncrByFloat("k", 1.1)) + + t.Log(test.Set("k", "3.0")) + t.Log(test.Get("k")) + t.Log(test.IncrByFloat("k", 1.000000000000)) + t.Log(test.Get("k")) + + test.Del("k") +} + +func TestRedisClient_Append(t *testing.T) { + t.Log(test.Exists("k")) + t.Log(test.Append("k", "nokia")) + t.Log(test.Append("k", " - 1110")) + t.Log(test.Get("k")) + + test.Del("k") +} + +func TestRedisClient_HDel(t *testing.T) { + t.Log(test.HSet("k", "f", "foo")) + t.Log(test.HDel("k", "f")) + t.Log(test.HDel("k", "b")) + + test.Del("k") +} +func TestRedisClient_HExists(t *testing.T) { + t.Log(test.HSet("k", "f", "foo")) + t.Log(test.HExists("k", "f")) + t.Log(test.HExists("k", "b")) + + test.Del("k") +} +func TestRedisClient_HGet(t *testing.T) { + t.Log(test.HSet("k", "redis", "redis.com")) + t.Log(test.HGet("k", "redis")) + t.Log(test.HGet("k", "mysql")) + + test.Del("k") +} +func TestRedisClient_HGetAll(t *testing.T) { + t.Log(test.HSet("k", "f", "foo")) + t.Log(test.HSet("k", "b", "bar")) + t.Log(test.HGetAll("k")) + + test.Del("k") +} +func TestRedisClient_HIncrBy(t *testing.T) { + t.Log(test.HSet("k", "f", 5)) + t.Log(test.HIncrBy("k", "f", 1)) + t.Log(test.HIncrBy("k", "f", -1)) + t.Log(test.HIncrBy("k", "f", -10)) + + test.Del("k") +} +func TestRedisClient_HIncrByFloat(t *testing.T) { + t.Log(test.HSet("k", "f", 10.50)) + t.Log(test.HIncrByFloat("k", "f", 0.1)) + t.Log(test.HIncrByFloat("k", "f", -5)) + + t.Log(test.HSet("k", "f", "5.0e3")) + t.Log(test.HIncrByFloat("k", "f", 200)) + + test.Del("k") +} +func TestRedisClient_HKeys(t *testing.T) { + t.Log(test.HSet("k", "f", "foo")) + t.Log(test.HSet("k", "b", "bar")) + t.Log(test.HKeys("k")) + + test.Del("k") + + t.Log(test.HKeys("k")) +} +func TestRedisClient_HLen(t *testing.T) { + t.Log(test.HSet("k", "f", "foo")) + t.Log(test.HSet("k", "b", "bar")) + t.Log(test.HLen("k")) + + test.Del("k") + + t.Log(test.HLen("k")) +} +func TestRedisClient_HMGet(t *testing.T) { + t.Log(test.HSet("k", "f", "foo")) + t.Log(test.HSet("k", "b", "bar")) + t.Log(test.HMGet("k", "f", "n", "b")) + + test.Del("k") +} +func TestRedisClient_HMSet(t *testing.T) { + t.Log(test.HMSet("k", [][2]interface{}{ + {1, 1}, {2, 2}, + })) + + t.Log(test.HGet("k", 1)) + t.Log(test.HGet("k", 2)) + t.Log(test.HGet("k", 3)) + + test.Del("k") +} +func TestRedisClient_HSetNX(t *testing.T) { + t.Log(test.HSetNX("k", 1, 1)) + t.Log(test.HSetNX("k", 1, 2)) + t.Log(test.HGet("k", 1)) + + test.Del("k") +} +func TestRedisClient_HVals(t *testing.T) { + t.Log(test.HSet(1, 1, 1)) + t.Log(test.HSet(1, 2, 2)) + t.Log(test.HVals(1)) + + test.Del(1) + + t.Log(test.HVals(1)) +} +func TestRedisClient_LPush(t *testing.T) { + t.Log(test.LPush(1, 1)) + t.Log(test.LPush(1, 2, 3)) + t.Log(test.LRange(1, 0, -1)) + + test.Del(1) + +} +func TestRedisClient_LIndex(t *testing.T) { + t.Log(test.LPush("k", "World", "Hello")) + t.Log(test.LIndex("k", 0)) + t.Log(test.LIndex("k", -1)) + t.Log(test.LIndex("k", 3)) + + test.Del("k") +} +func TestRedisClient_LRange(t *testing.T) { + t.Log(test.RPush("k", "hello")) + t.Log(test.RPush("k", "foo", "bar")) + t.Log(test.LRange("k", 0, 0)) + t.Log(test.LRange("k", -3, 2)) + t.Log(test.LRange("k", -100, 100)) + t.Log(test.LRange("k", 5, 10)) + + test.Del("k") +} +func TestRedisClient_RPush(t *testing.T) { + t.Log(test.RPush("k", "hello")) + t.Log(test.RPush("k", "foo", "bar")) + t.Log(test.LRange("k", 0, -1)) + + test.Del("k") +} +func TestRedisClient_LLen(t *testing.T) { + test.RPush(1, 1, 1, 1, 1) + t.Log(test.LLen(1)) + + test.Del(1) +} +func TestRedisClient_LPop(t *testing.T) { + test.RPush(1, 1, 2, 3, 4) + t.Log(test.LPop(1)) + t.Log(test.LPop(1)) + t.Log(test.LPop(1)) + t.Log(test.LPop(1)) + t.Log(test.LPop(1)) + + test.Del(1) +} +func TestRedisClient_LSet(t *testing.T) { + test.RPush(1, 1, 2, 3, 4, 5, 6, 7) + t.Log(test.LSet(1, "foo", 4)) + t.Log(test.LRange(1, 0, -1)) + + test.Del(1) +} +func TestRedisClient_RPop(t *testing.T) { + test.RPush(1, 1, 2, 3, 4, 5, 6, 7) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + t.Log(test.RPop(1)) + + test.Del(1) +} +func TestRedisClient_SCard(t *testing.T) { + t.Log(test.SAdd(1, 1, 2, 3, 4, 5, 1, 2, 3)) + t.Log(test.SCard(1)) + + test.Del(1) +} +func TestRedisClient_SDiff(t *testing.T) { + test.SAdd(1, 1, 2, 3) + test.SAdd(2, 3, 4, 5) + t.Log(test.SDiff(1, 2)) + + test.Del(1) + test.Del(2) +} +func TestRedisClient_SInter(t *testing.T) { + test.SAdd(1, 1, 2, 3) + test.SAdd(2, 3, 4, 5) + t.Log(test.SInter(1, 2)) + + test.Del(1) + test.Del(2) +} +func TestRedisClient_SIsMember(t *testing.T) { + test.SAdd(1, 1) + t.Log(test.SIsMember(1, 1)) + t.Log(test.SIsMember(1, 2)) + + test.Del(1) +} +func TestRedisClient_SMembers(t *testing.T) { + test.SAdd(1, 1, 2, 3, 4) + t.Log(test.SMembers(1)) + + test.Del(1) +} +func TestRedisClient_SPop(t *testing.T) { + test.SAdd(1, 1, 2, 3, 4, 5) + t.Log(test.SPop(1)) + t.Log(test.SPopN(1, 13)) + + test.Del(1) +} +func TestRedisClient_SRandMember(t *testing.T) { + test.SAdd(1, 1, 2, 3, 4, 5, 6) + t.Log(test.SRandMember(1)) + t.Log(test.SRandMemberN(1, 3)) + + test.Del(1) +} +func TestRedisClient_SRem(t *testing.T) { + test.SAdd(1, 1, 2, 3, 4, 5, 6) + t.Log(test.SRem(1, 2)) + t.Log(test.SRem(1, 2, 3, 4, 5)) + t.Log(test.SMembers(1)) + + test.Del(1) +} +func TestRedisClient_SUnion(t *testing.T) { + test.SAdd(1, 1, 2, 3, 4, 5, 6) + test.SAdd(2, 4, 5, 6, 7, 8, 9) + t.Log(test.SUnion(1, 2)) + + test.Del(1) + test.Del(2) +} +func TestRedisClient_ZRange(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZRange(1, 0, -1)) + t.Log(test.ZRangeWithScores(1, 0, -1)) + + t.Log(test.ZRange(1, 1, 2)) + t.Log(test.ZRangeWithScores(1, 1, 2)) + + t.Log(test.ZRange(1, 0, 20000)) + t.Log(test.ZRangeWithScores(1, 0, 20000)) + + t.Log(test.ZRange(1, 20000, 30000)) + t.Log(test.ZRangeWithScores(1, 20000, 30000)) + + test.Del(1) +} +func TestRedisClient_ZCard(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZCard(1)) + + test.Del(1) +} +func TestRedisClient_ZCount(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZCount(1, 1, 3)) + + test.Del(1) +} +func TestRedisClient_ZIncrBy(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZIncrBy(1, 1, 3.4)) + t.Log(test.ZRangeWithScores(1, 0, -1)) + + test.Del(1) +} +func TestRedisClient_ZRank(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZRangeWithScores(1, 0, -1)) + t.Log(test.ZRank(1, 1)) + t.Log(test.ZRevRank(1, 1)) + t.Log(test.ZRank(1, 3)) + t.Log(test.ZRevRank(1, 3)) + + test.Del(1) +} +func TestRedisClient_ZRem(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + + t.Log(test.ZRem(1, 1)) + t.Log(test.ZRem(1, 1, 2, 3)) + t.Log(test.ZRangeWithScores(1, 0, -1)) + + test.Del(1) +} +func TestRedisClient_ZRevRange(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZRevRange(1, 0, -1)) + t.Log(test.ZRevRangeWithScores(1, 0, -1)) + + t.Log(test.ZRevRange(1, 1, 2)) + t.Log(test.ZRevRangeWithScores(1, 1, 2)) + + t.Log(test.ZRevRange(1, 0, 20000)) + t.Log(test.ZRevRangeWithScores(1, 0, 20000)) + + t.Log(test.ZRevRange(1, 20000, 30000)) + t.Log(test.ZRevRangeWithScores(1, 20000, 30000)) + + test.Del(1) +} +func TestRedisClient_ZScore(t *testing.T) { + test.ZAdd(1, [][2]interface{}{ + {1, 1}, + {2, 2}, + {3, 3}, + {4, 4}, + }) + t.Log(test.ZRangeWithScores(1, 0, -1)) + t.Log(test.ZScore(1, 1)) + t.Log(test.ZScore(1, 3)) + + test.Del(1) +}