gitee.com/lh-her-team/common@v1.5.1/gredis/redis.go (about)

     1  package gredis
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"strconv"
     7  	"time"
     8  
     9  	"github.com/gomodule/redigo/redis"
    10  )
    11  
    12  type RedisHandler struct {
    13  	RedisConn *redis.Pool
    14  }
    15  
    16  func NewRedisHandler() *RedisHandler {
    17  	r := new(RedisHandler)
    18  	return r
    19  }
    20  
    21  func (r *RedisHandler) Init(url, auth string, db, maxIdle, maxActive, idleTimeout int) error {
    22  	r.RedisConn = &redis.Pool{
    23  		MaxIdle:     maxIdle,
    24  		MaxActive:   maxActive,
    25  		IdleTimeout: time.Duration(idleTimeout),
    26  		Dial: func() (redis.Conn, error) {
    27  			c, err := redis.Dial("tcp", url)
    28  			if err != nil {
    29  				return nil, err
    30  			}
    31  			if auth != "" {
    32  				if _, err = c.Do("AUTH", auth); err != nil {
    33  					c.Close()
    34  					return nil, err
    35  				}
    36  			}
    37  			if db != 0 {
    38  				if _, err = c.Do("SELECT", db); err != nil {
    39  					c.Close()
    40  					return nil, err
    41  				}
    42  			}
    43  			return c, err
    44  		},
    45  		//应用程序检查健康功能
    46  		TestOnBorrow: func(c redis.Conn, _ time.Time) error {
    47  			_, err := c.Do("PING")
    48  			return err
    49  		},
    50  	}
    51  	_, err := r.RedisConn.Get().Do("PING")
    52  	if err != nil {
    53  		return err
    54  	}
    55  	return nil
    56  }
    57  
    58  // Set json
    59  func (r *RedisHandler) Set(key string, data interface{}, time int) error {
    60  	conn := r.RedisConn.Get()
    61  	defer conn.Close()
    62  	value, err := json.Marshal(data)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	_, err = conn.Do("SET", key, value)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	if time > 0 {
    71  		_, err = conn.Do("EXPIRE", key, time)
    72  		if err != nil {
    73  			return err
    74  		}
    75  	}
    76  	return nil
    77  }
    78  
    79  func (r *RedisHandler) SetVal(key, value interface{}, time int) error {
    80  	conn := r.RedisConn.Get()
    81  	defer conn.Close()
    82  	if v, ok := value.(int); ok {
    83  		value = strconv.Itoa(v)
    84  	} else if v, ok := value.(string); ok {
    85  		value = v
    86  	} else if v, ok := value.([]byte); ok {
    87  		value = v
    88  	} else {
    89  		return errors.New("redis set invalid value")
    90  	}
    91  	_, err := conn.Do("SET", key, value)
    92  	if err != nil {
    93  		return err
    94  	}
    95  	if time > 0 {
    96  		_, err = conn.Do("EXPIRE", key, time)
    97  		if err != nil {
    98  			return err
    99  		}
   100  	}
   101  	return nil
   102  }
   103  
   104  // Exists check a key
   105  func (r *RedisHandler) Exists(key string) bool {
   106  	conn := r.RedisConn.Get()
   107  	defer conn.Close()
   108  	exists, err := redis.Bool(conn.Do("EXISTS", key))
   109  	if err != nil {
   110  		return false
   111  	}
   112  	return exists
   113  }
   114  
   115  // ttl a key
   116  func (r *RedisHandler) Ttl(key string) int {
   117  	conn := r.RedisConn.Get()
   118  	defer conn.Close()
   119  	ttl, err := redis.Int(conn.Do("TTL", key))
   120  	if err != nil {
   121  		return -3
   122  	}
   123  	return ttl
   124  }
   125  
   126  // Get get a key
   127  func (r *RedisHandler) Get(key string) ([]byte, error) {
   128  	conn := r.RedisConn.Get()
   129  	defer conn.Close()
   130  	reply, err := redis.Bytes(conn.Do("GET", key))
   131  	if err != nil {
   132  		return nil, err
   133  	}
   134  	return reply, nil
   135  }
   136  
   137  func (r *RedisHandler) GetString(key string) (string, error) {
   138  	bytes, err := r.Get(key)
   139  	if err != nil {
   140  		return "", err
   141  	}
   142  	return string(bytes), nil
   143  }
   144  
   145  func (r *RedisHandler) GetInt(key string) (int, error) {
   146  	bytes, err := r.Get(key)
   147  	if err != nil {
   148  		return -1, err
   149  	}
   150  	sVal := string(bytes)
   151  	iVal, err := strconv.Atoi(sVal)
   152  	if err != nil {
   153  		return -1, err
   154  	}
   155  	return iVal, nil
   156  }
   157  
   158  // Delete delete a kye
   159  func (r *RedisHandler) Delete(key string) (bool, error) {
   160  	conn := r.RedisConn.Get()
   161  	defer conn.Close()
   162  	return redis.Bool(conn.Do("DEL", key))
   163  }
   164  
   165  // LikeDeletes batch delete
   166  func (r *RedisHandler) LikeDeletes(key string) error {
   167  	conn := r.RedisConn.Get()
   168  	defer conn.Close()
   169  	keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*"))
   170  	if err != nil {
   171  		return err
   172  	}
   173  	for _, key := range keys {
   174  		_, err = r.Delete(key)
   175  		if err != nil {
   176  			return err
   177  		}
   178  	}
   179  	return nil
   180  }
   181  
   182  // Incr get a key
   183  func (r *RedisHandler) Incr(key string) (int, error) {
   184  	conn := r.RedisConn.Get()
   185  	defer conn.Close()
   186  	reply, err := redis.Int(conn.Do("INCR", key))
   187  	if err != nil {
   188  		return -1, err
   189  	}
   190  	return reply, nil
   191  }
   192  
   193  // GetSumLikeKeys - get the sum of all likely keys value
   194  func (r *RedisHandler) GetSumLikeKeys(key string) (int, error) {
   195  	conn := r.RedisConn.Get()
   196  	defer conn.Close()
   197  	keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*"))
   198  	if err != nil {
   199  		return -1, err
   200  	}
   201  	sum := 0
   202  	for _, key := range keys {
   203  		val, err := r.GetInt(key)
   204  		if err != nil {
   205  			return -1, err
   206  		}
   207  		sum += val
   208  	}
   209  	return sum, nil
   210  }