backup_redis.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. package jobs
  2. import (
  3. "encoding/json"
  4. "gadmin/config"
  5. "gadmin/utility"
  6. "gadmin/utility/compress"
  7. "os"
  8. "path"
  9. "path/filepath"
  10. "time"
  11. "github.com/sirupsen/logrus"
  12. "github.com/spf13/cast"
  13. )
  14. var BackupRedis = new(jBackupRedis)
  15. const RedisBackupPath = "/redisHistoryKeys/" // 备份二级路径
  16. type jBackupRedis struct{}
  17. func (j *jBackupRedis) Run() {
  18. //logrus.Info("BackupRedis Run.....")
  19. //
  20. //if os.Getenv("GIN_MODE") == "release" {
  21. // j.createDir()
  22. // j.cleanDateType()
  23. // j.cleanWeekType()
  24. // j.refreshDownloadList()
  25. //} else {
  26. // logrus.Warn("非正式环境无需进行备份,跳过..")
  27. //}
  28. }
  29. // cleanDateType 清理日期类型
  30. func (j *jBackupRedis) cleanDateType() {
  31. now := time.Now()
  32. firstDay := time.Date(now.Year(), time.January, 1, 0, 0, 0, 0, now.Location()).Unix()
  33. lastDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).Unix() - 86400*21 // 3周前
  34. for i := firstDay; i <= lastDay; i += 86400 {
  35. format1 := time.Unix(i, 0).Format("2006-01-02")
  36. j.cleanString("luck_draw_v2:" + format1)
  37. j.cleanString("day_task_v2:" + format1)
  38. format2 := time.Unix(i, 0).Format("20060102")
  39. j.cleanZSet("curio_ranking:" + format2)
  40. }
  41. }
  42. // cleanWeekType 清理周类型
  43. func (j *jBackupRedis) cleanWeekType() {
  44. var (
  45. start = utility.WeekByDate(time.Now()) - 4 // -4是从3周前截止
  46. )
  47. for i := 1; i <= start; i++ {
  48. j.cleanHash("pvpplayers:" + cast.ToString(i))
  49. j.cleanHash("pvphistorys:" + cast.ToString(i))
  50. j.cleanHash("pvpmode:" + cast.ToString(i))
  51. j.cleanZSet("ranking_pvp:" + cast.ToString(i))
  52. j.cleanZSet("ranking_list:" + cast.ToString(i))
  53. }
  54. }
  55. func (j *jBackupRedis) cleanString(key string) {
  56. logrus.Info("cleanString 正在清理: ", key)
  57. models := config.GameRedis.Get(key).Val()
  58. if models == "" {
  59. logrus.Info(key, "不存在已跳过..")
  60. return
  61. }
  62. j.compression(key, models)
  63. //config.Redis.Del(key)
  64. }
  65. func (j *jBackupRedis) cleanHash(key string) {
  66. logrus.Info("cleanHash 正在清理: ", key)
  67. type Models struct {
  68. Member string `json:"member"`
  69. Score string `json:"score"`
  70. }
  71. var (
  72. err error
  73. cursor uint64 = 0
  74. match = ""
  75. count int64 = 20000
  76. models []Models
  77. )
  78. keys, cursor, err := config.GameRedis.HScan(key, cursor, match, count).Result()
  79. if len(keys) == 0 {
  80. logrus.Info(key, "不存在已跳过..")
  81. return
  82. }
  83. if err != nil {
  84. logrus.Info("HScan err:", key, err)
  85. return
  86. }
  87. for i := 0; i < len(keys); i++ {
  88. if utility.IsEven(i) {
  89. models = append(models, Models{Member: keys[i], Score: keys[i+1]})
  90. }
  91. }
  92. j.compression(key, models)
  93. //config.Redis.Del(key)
  94. }
  95. func (j *jBackupRedis) cleanZSet(key string) {
  96. logrus.Info("cleanZSet 正在清理: ", key)
  97. type Models struct {
  98. Member string `json:"member"`
  99. Score string `json:"score"`
  100. }
  101. var (
  102. err error
  103. cursor uint64 = 0
  104. match = ""
  105. count int64 = 20000
  106. models []Models
  107. )
  108. keys, cursor, err := config.GameRedis.ZScan(key, cursor, match, count).Result()
  109. if len(keys) == 0 {
  110. logrus.Info(key, "不存在已跳过..")
  111. return
  112. }
  113. if err != nil {
  114. logrus.Info("ZScan err:", key, err)
  115. return
  116. }
  117. for i := 0; i < len(keys); i++ {
  118. if utility.IsEven(i) {
  119. models = append(models, Models{Member: keys[i], Score: keys[i+1]})
  120. }
  121. }
  122. j.compression(key, models)
  123. //config.Redis.Del(key)
  124. }
  125. // compression 统一压缩处理
  126. func (j *jBackupRedis) compression(key string, models interface{}) {
  127. bytes, err := json.Marshal(models)
  128. if err != nil {
  129. logrus.Infof("json.Marshal err:%v", err)
  130. return
  131. }
  132. fileName, gzFilePath := j.getCompressPath(key)
  133. if err = compress.DoGzip(bytes, gzFilePath, fileName); err != nil {
  134. logrus.Infof("compress.DoGzip err:%v", err)
  135. return
  136. }
  137. }
  138. func (j *jBackupRedis) createDir() {
  139. utility.CreateDir(os.Getenv("BACKUP_PATH") + RedisBackupPath)
  140. }
  141. // getCompressPath 获取压缩路径
  142. func (j *jBackupRedis) getCompressPath(key string) (fileName, gzFilePath string) {
  143. fileName = key + ".json"
  144. gzFilePath = os.Getenv("BACKUP_PATH") + RedisBackupPath + key + ".gz"
  145. return
  146. }
  147. // refreshDownloadList 刷新下载列表
  148. func (j *jBackupRedis) refreshDownloadList() {
  149. var (
  150. downloadJsonPath = os.Getenv("BACKUP_PATH") + RedisBackupPath + "download.json"
  151. files []string
  152. )
  153. file, err := os.OpenFile(downloadJsonPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
  154. if err != nil {
  155. logrus.Errorf("文件错误,错误为:%v\n", err)
  156. return
  157. }
  158. defer file.Close()
  159. err = filepath.Walk(os.Getenv("BACKUP_PATH"), func(pat string, info os.FileInfo, err error) error {
  160. if path.Ext(info.Name()) == ".gz" {
  161. files = append(files, info.Name())
  162. }
  163. return nil
  164. })
  165. if err != nil {
  166. logrus.Errorf("filepath.Walk err:%v\n", err)
  167. return
  168. }
  169. bytes, err := json.Marshal(files)
  170. if err != nil {
  171. logrus.Errorf("json.Marshal err:%v\n", err)
  172. return
  173. }
  174. if _, err = file.Write(bytes); err != nil {
  175. logrus.Errorf("file.Write err:%v\n", err)
  176. return
  177. }
  178. logrus.Infof("刷新下载列表:%+v", files)
  179. }