redis_cnn.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package redis
  2. import (
  3. "time"
  4. "git.shuncheng.lu/bigthing/gocommon/pkg/internal/util"
  5. "github.com/garyburd/redigo/redis"
  6. )
  7. // 先不支持tls
  8. type Config struct {
  9. Host string `json:"host"`
  10. Password string `json:"password"` // 默认没有
  11. Database int `json:"database"` // 默认0
  12. IdleTimeout time.Duration `json:"idle_timeout"` // 空闲的超时时间,默认10s
  13. MaxIdle int `json:"max_idle"` // 默认50
  14. MaxActive int `json:"max_conn"` // 默认10000
  15. ConnectTimeOut time.Duration `json:"connect_time_out"` // 默认超时都是5s
  16. ReadTimeOut time.Duration `json:"read_time_out"`
  17. WriteTimeOut time.Duration `json:"write_time_out"`
  18. }
  19. func getRedisConfigFromMap(config map[string]string) Config {
  20. return Config{
  21. Host: config["host"],
  22. Password: config["password"],
  23. Database: util.String2Int(config["database"]),
  24. IdleTimeout: util.StringSecToDuration(config["idle_timeout"]),
  25. MaxIdle: util.String2Int(config["max_idle"]),
  26. MaxActive: util.String2Int(config["max_conn"]),
  27. ConnectTimeOut: util.StringSecToDuration(config["connect_time_out"]),
  28. ReadTimeOut: util.StringSecToDuration(config["read_time_out"]),
  29. WriteTimeOut: util.StringSecToDuration(config["write_time_out"]),
  30. }
  31. }
  32. func getRedisConfig(key string, assertNil util.SetAndAssertNil) (map[string]string, error) {
  33. config := make(map[string]string, 0)
  34. if err := assertNil(config, key, "host", ""); err != nil {
  35. return nil, err
  36. }
  37. if err := assertNil(config, key, "cache_prefix", ""); err != nil {
  38. //return nil, err
  39. util.Warnf("%s config not set cache_prefix default nil ", key)
  40. }
  41. if err := assertNil(config, key, "password", ""); err != nil {
  42. //return nil, err
  43. util.Warnf("%s config not set password default nil ", key)
  44. }
  45. if err := assertNil(config, key, "database", ""); err != nil {
  46. //return nil, err
  47. util.Warnf("%s config not set database default 0", key)
  48. }
  49. if err := assertNil(config, key, "idle_timeout", "10"); err != nil {
  50. return nil, err
  51. }
  52. if err := assertNil(config, key, "max_idle", "50"); err != nil {
  53. return nil, err
  54. }
  55. if err := assertNil(config, key, "max_conn", "10000"); err != nil {
  56. return nil, err
  57. }
  58. if err := assertNil(config, key, "connect_time_out", "5"); err != nil {
  59. return nil, err
  60. }
  61. if err := assertNil(config, key, "read_time_out", "5"); err != nil {
  62. return nil, err
  63. }
  64. if err := assertNil(config, key, "write_time_out", "5"); err != nil {
  65. return nil, err
  66. }
  67. if err := assertNil(config, key, "is_direct", "false"); err != nil {
  68. return nil, err
  69. }
  70. return config, nil
  71. }
  72. func newRedisPool(config Config) (*redis.Pool, error) {
  73. ping := func(r *redis.Pool) error {
  74. cnn := r.Get()
  75. defer cnn.Close()
  76. _, err := cnn.Do("PING")
  77. return err
  78. }
  79. init := func(config Config) Config {
  80. if config.ReadTimeOut == 0 {
  81. config.ReadTimeOut = time.Second * 5
  82. }
  83. if config.ConnectTimeOut == 0 {
  84. config.ConnectTimeOut = time.Second * 5
  85. }
  86. if config.WriteTimeOut == 0 {
  87. config.WriteTimeOut = time.Second * 5
  88. }
  89. if config.MaxActive == 0 {
  90. config.MaxActive = 10000
  91. }
  92. if config.MaxIdle == 0 {
  93. config.MaxIdle = 10
  94. }
  95. if config.IdleTimeout == 0 {
  96. config.IdleTimeout = time.Second * 10
  97. }
  98. return config
  99. }
  100. config = init(config)
  101. pool := &redis.Pool{
  102. //Wait: true, // 是否等待从连接池中获取,这里最好设置为false,默认就是false
  103. MaxActive: config.MaxActive,
  104. MaxIdle: config.MaxIdle,
  105. IdleTimeout: config.IdleTimeout,
  106. Dial: func() (redis.Conn, error) {
  107. c, err := redis.Dial("tcp", config.Host,
  108. redis.DialConnectTimeout(config.ConnectTimeOut),
  109. redis.DialReadTimeout(config.ReadTimeOut),
  110. redis.DialWriteTimeout(config.WriteTimeOut),
  111. redis.DialPassword(config.Password),
  112. redis.DialDatabase(config.Database),
  113. )
  114. if err != nil {
  115. return nil, err
  116. }
  117. return c, err
  118. },
  119. TestOnBorrow: func(c redis.Conn, t time.Time) error {
  120. // 如果小于空闲时间,则不进行检测,优化好处不用每次拿去连接都ping一次(t是上次使用的时间)
  121. //fmt.Printf("pre: %s, cur: %s, idel: %v\n", t.Format("2006-01-02 15:04:05"), time.Now().Format("2006-01-02 15:04:05"), config.IdleTimeout/time.Second)
  122. if time.Since(t) < config.IdleTimeout {
  123. return nil
  124. }
  125. //fmt.Println("ping")
  126. _, err := c.Do("PING")
  127. //defer c.Close() // 这里不能关闭,当去借连接的时候,回去测试一下连接是否可用
  128. return err
  129. },
  130. }
  131. if err := ping(pool); err != nil {
  132. pool.Close()
  133. return nil, err
  134. }
  135. return pool, nil
  136. }