main.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package cache
  2. import (
  3. "dsbqj-admin/pkg/logger"
  4. "dsbqj-admin/pkg/util"
  5. "github.com/go-redis/redis"
  6. "os"
  7. "strconv"
  8. "sync/atomic"
  9. "time"
  10. )
  11. // RedisClient Redis缓存客户端单例
  12. var RedisReport *redis.Client
  13. var num int32 = 0
  14. // Redis 在中间件中初始化redis链接
  15. func Redis() {
  16. RedisReportInit()
  17. startListen()
  18. }
  19. func startListen() {
  20. ListenRedis("redis_report", RedisReport, RedisReportInit)
  21. }
  22. func RedisReportInit() {
  23. db, _ := strconv.ParseUint(os.Getenv("REDIS_DB"), 10, 64)
  24. client := redis.NewClient(&redis.Options{
  25. Addr: os.Getenv("REDIS_ADDR"),
  26. Password: os.Getenv("REDIS_PW"),
  27. DB: int(db),
  28. })
  29. _, err := client.Ping().Result()
  30. if err != nil {
  31. if num == 0 {
  32. panic("redis connect err")
  33. }
  34. return
  35. }
  36. logger.Info("redis 数据库连接成功 第%d次连接", num)
  37. RedisReport = client
  38. }
  39. func ListenRedis(mark string, rd *redis.Client, connect func()) {
  40. util.StartMinorGO("redis connect", func() {
  41. for {
  42. time.Sleep(5 * time.Second)
  43. _, err := rd.Ping().Result()
  44. if err != nil {
  45. num = atomic.AddInt32(&num, 1)
  46. logger.Info("%s---> redis client reconnect num: %d", mark, num)
  47. connect()
  48. }
  49. }
  50. }, func(isdebug bool) {})
  51. }