online.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package online
  2. import (
  3. "fmt"
  4. "strconv"
  5. "time"
  6. _ "bet24.com/log"
  7. "bet24.com/redis"
  8. )
  9. /*
  10. redis缓存在线
  11. 每隔1分钟上报在线,在线超时为1.5分钟
  12. 缓存格式为:
  13. online_WebProxy_ServerID ,Online
  14. online_DataServer_ServerID,Online
  15. */
  16. const Online_Expire_Seconds = 120
  17. const (
  18. ServerType_WebProxy = "WebProxy"
  19. ServerType_DataServer = "DataServer"
  20. ServerType_MatchServer = "MatchServer"
  21. ServerType_ClubServer = "ClubServer"
  22. )
  23. var Instance *online
  24. type online struct {
  25. ServerID string
  26. ServerType string
  27. OnlineFunc func() int
  28. }
  29. func (o *online) Run() {
  30. o.UpdateOnline()
  31. }
  32. func (o *online) UpdateOnline() {
  33. time.AfterFunc(time.Minute, o.UpdateOnline)
  34. onlineCount := o.OnlineFunc()
  35. o.writeOnlineToDB(onlineCount)
  36. }
  37. func (o *online) writeOnlineToDB(onlineCount int) {
  38. key := fmt.Sprintf("online:%s:%s", o.ServerType, o.ServerID)
  39. redis.String_SetEx(key, strconv.Itoa(onlineCount), Online_Expire_Seconds)
  40. }
  41. func Run(serverID, serverType string, onlineFunc func() int) {
  42. Instance = new(online)
  43. Instance.ServerID = serverID
  44. Instance.ServerType = serverType
  45. Instance.OnlineFunc = onlineFunc
  46. Instance.Run()
  47. }
  48. // 获取指定类型服务器的在线人数,如果serverType为空,则取所有在线
  49. func GetOnlineCount(serverType string) int {
  50. var key string
  51. if serverType == "" {
  52. key = fmt.Sprintf("online:*")
  53. } else {
  54. key = fmt.Sprintf("online:%s:*", serverType)
  55. }
  56. // 模糊查询所有的在线服务器纪录
  57. servers := redis.Key_GetKeys(key)
  58. ret := 0
  59. for _, v := range servers {
  60. ret += redis.String_GetInt(v)
  61. }
  62. return ret
  63. }