redis.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package v1
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "time"
  7. "go-common/app/infra/config/model"
  8. "go-common/library/cache/redis"
  9. "go-common/library/log"
  10. )
  11. const (
  12. expireDuration = 3 * time.Hour
  13. _hostKey = "%s_%s"
  14. )
  15. // Hostkey host cache key
  16. func hostKey(svr, env string) string {
  17. return fmt.Sprintf(_hostKey, svr, env)
  18. }
  19. // Hosts return service hosts from redis.
  20. func (d *Dao) Hosts(c context.Context, svr, env string) (hosts []*model.Host, err error) {
  21. var (
  22. dels []string
  23. now = time.Now()
  24. hostkey = hostKey(svr, env)
  25. conn = d.redis.Get(c)
  26. )
  27. defer conn.Close()
  28. res, err := redis.Strings(conn.Do("HGETALL", hostkey))
  29. if err != nil {
  30. log.Error("conn.Do(HGETALL, %s) error(%v)", hostkey, err)
  31. return
  32. }
  33. for i, r := range res {
  34. if i%2 == 0 {
  35. continue
  36. }
  37. h := &model.Host{}
  38. if err = json.Unmarshal([]byte(r), h); err != nil {
  39. log.Error("json.Unmarshal(%s) error(%v)", r, err)
  40. return
  41. }
  42. if now.Sub(h.HeartbeatTime.Time()) <= d.expire+5 {
  43. h.State = model.HostOnline
  44. hosts = append(hosts, h)
  45. } else if now.Sub(h.HeartbeatTime.Time()) >= expireDuration {
  46. dels = append(dels, h.Name)
  47. } else {
  48. h.State = model.HostOffline
  49. hosts = append(hosts, h)
  50. }
  51. }
  52. if len(dels) > 0 {
  53. if _, err1 := conn.Do("HDEL", hostkey, dels); err1 != nil {
  54. log.Error("conn.Do(HDEL, %s, %v) error(%v)", hostkey, dels, err1)
  55. }
  56. }
  57. return
  58. }
  59. // SetHost add service host to redis.
  60. func (d *Dao) SetHost(c context.Context, host *model.Host, svr, env string) (err error) {
  61. hostkey := hostKey(svr, env)
  62. b, err := json.Marshal(host)
  63. if err != nil {
  64. log.Error("json.Marshal(%s) error(%v)", host, err)
  65. return
  66. }
  67. conn := d.redis.Get(c)
  68. defer conn.Close()
  69. if _, err = conn.Do("HSET", hostkey, host.Name, string(b)); err != nil {
  70. log.Error("conn.Do(SET, %s, %s, %v) error(%v)", hostkey, host.Name, host, err)
  71. }
  72. return
  73. }
  74. // ClearHost clear all hosts.
  75. func (d *Dao) ClearHost(c context.Context, svr, env string) (err error) {
  76. var (
  77. hostkey = hostKey(svr, env)
  78. conn = d.redis.Get(c)
  79. )
  80. defer conn.Close()
  81. if _, err = conn.Do("DEL", hostkey); err != nil {
  82. log.Error("conn.Do(DEL, %s) error(%v)", hostkey, err)
  83. }
  84. return
  85. }
  86. // Ping check Redis connection
  87. func (d *Dao) pingRedis(c context.Context) (err error) {
  88. conn := d.redis.Get(c)
  89. _, err = conn.Do("SET", "PING", "PONG")
  90. conn.Close()
  91. return
  92. }