redis.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package redis
  2. import (
  3. "errors"
  4. "log"
  5. "strings"
  6. "time"
  7. red "github.com/gomodule/redigo/redis"
  8. )
  9. var redisPool map[string]*red.Pool
  10. //初始化
  11. func InitRedis(addrs string) {
  12. redisPool = map[string]*red.Pool{}
  13. addr := strings.Split(addrs, ",")
  14. for _, v := range addr {
  15. saddr := strings.Split(v, "=")
  16. redisPool[saddr[0]] = &red.Pool{
  17. MaxIdle: 256,
  18. MaxActive: 0,
  19. IdleTimeout: time.Duration(120),
  20. Dial: func() (red.Conn, error) {
  21. return red.Dial(
  22. "tcp",
  23. saddr[1],
  24. red.DialReadTimeout(time.Duration(2000)*time.Millisecond),
  25. red.DialWriteTimeout(time.Duration(2000)*time.Millisecond),
  26. red.DialConnectTimeout(time.Duration(2000)*time.Millisecond),
  27. red.DialDatabase(0),
  28. )
  29. },
  30. }
  31. }
  32. }
  33. //存储
  34. func PutRedis(code string, db int, key, val interface{}, timeout int) bool {
  35. b := false
  36. var err error
  37. con := redisPool[code].Get()
  38. if err = con.Err(); err != nil {
  39. log.Println("redisutil-conn Error", err)
  40. return b
  41. }
  42. defer con.Close()
  43. _, err = con.Do("select", db)
  44. if err != nil {
  45. log.Println("redisutil-select Error", err)
  46. return b
  47. }
  48. if timeout <= 0 {
  49. _, err = con.Do("SET", key, val)
  50. } else {
  51. _, err = con.Do("SET", key, val, "EX", timeout)
  52. }
  53. if err != nil {
  54. log.Println("redisutil-set Error", err)
  55. return b
  56. } else {
  57. b = true
  58. }
  59. return b
  60. }
  61. //获取字符串
  62. func GetRedisStr(code string, db int, key interface{}) (string, error) {
  63. res, err := GetNewInterface(code, db, key)
  64. if err != nil {
  65. return "", err
  66. } else {
  67. if res == nil {
  68. return "", nil
  69. } else {
  70. if bt, ok := res.([]byte); ok {
  71. return string(bt), nil
  72. } else { //转化出错
  73. return "", errors.New("Error Converting Data")
  74. }
  75. }
  76. }
  77. }
  78. func GetNewInterface(code string, db int, key interface{}) (res interface{}, err error) {
  79. con := redisPool[code].Get()
  80. if err = con.Err(); err != nil {
  81. return nil, err
  82. }
  83. defer con.Close()
  84. _, err = con.Do("select", db)
  85. if err != nil {
  86. log.Println(err)
  87. return nil, err
  88. }
  89. return con.Do("GET", key)
  90. }
  91. //判断是否存在
  92. func ExistRedis(code string, db int, key interface{}, args ...interface{}) (bool, error) {
  93. con := redisPool[code].Get()
  94. if err := con.Err(); err != nil {
  95. log.Println("redis exist error:", err)
  96. return false, err
  97. }
  98. defer con.Close()
  99. _, err := con.Do("select", db)
  100. if err != nil {
  101. log.Println("redis select error:", err)
  102. return false, err
  103. }
  104. parmas := make([]interface{}, 0)
  105. parmas = append(parmas, key)
  106. if len(args) > 0 {
  107. for _, v := range args {
  108. parmas = append(parmas, v)
  109. }
  110. }
  111. repl, err := con.Do("exists", parmas...)
  112. ret, _ := red.Int(repl, err)
  113. return ret == 1, err
  114. }