123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- package jobs
- import (
- "encoding/json"
- "gadmin/config"
- "gadmin/utility"
- "gadmin/utility/compress"
- "os"
- "path"
- "path/filepath"
- "time"
- "github.com/sirupsen/logrus"
- "github.com/spf13/cast"
- )
- var BackupRedis = new(jBackupRedis)
- const RedisBackupPath = "/redisHistoryKeys/" // 备份二级路径
- type jBackupRedis struct{}
- func (j *jBackupRedis) Run() {
- //logrus.Info("BackupRedis Run.....")
- //
- //if os.Getenv("GIN_MODE") == "release" {
- // j.createDir()
- // j.cleanDateType()
- // j.cleanWeekType()
- // j.refreshDownloadList()
- //} else {
- // logrus.Warn("非正式环境无需进行备份,跳过..")
- //}
- }
- // cleanDateType 清理日期类型
- func (j *jBackupRedis) cleanDateType() {
- now := time.Now()
- firstDay := time.Date(now.Year(), time.January, 1, 0, 0, 0, 0, now.Location()).Unix()
- lastDay := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location()).Unix() - 86400*21 // 3周前
- for i := firstDay; i <= lastDay; i += 86400 {
- format1 := time.Unix(i, 0).Format("2006-01-02")
- j.cleanString("luck_draw_v2:" + format1)
- j.cleanString("day_task_v2:" + format1)
- format2 := time.Unix(i, 0).Format("20060102")
- j.cleanZSet("curio_ranking:" + format2)
- }
- }
- // cleanWeekType 清理周类型
- func (j *jBackupRedis) cleanWeekType() {
- var (
- start = utility.WeekByDate(time.Now()) - 4 // -4是从3周前截止
- )
- for i := 1; i <= start; i++ {
- j.cleanHash("pvpplayers:" + cast.ToString(i))
- j.cleanHash("pvphistorys:" + cast.ToString(i))
- j.cleanHash("pvpmode:" + cast.ToString(i))
- j.cleanZSet("ranking_pvp:" + cast.ToString(i))
- j.cleanZSet("ranking_list:" + cast.ToString(i))
- }
- }
- func (j *jBackupRedis) cleanString(key string) {
- logrus.Info("cleanString 正在清理: ", key)
- models := config.GameRedis.Get(key).Val()
- if models == "" {
- logrus.Info(key, "不存在已跳过..")
- return
- }
- j.compression(key, models)
- //config.Redis.Del(key)
- }
- func (j *jBackupRedis) cleanHash(key string) {
- logrus.Info("cleanHash 正在清理: ", key)
- type Models struct {
- Member string `json:"member"`
- Score string `json:"score"`
- }
- var (
- err error
- cursor uint64 = 0
- match = ""
- count int64 = 20000
- models []Models
- )
- keys, cursor, err := config.GameRedis.HScan(key, cursor, match, count).Result()
- if len(keys) == 0 {
- logrus.Info(key, "不存在已跳过..")
- return
- }
- if err != nil {
- logrus.Info("HScan err:", key, err)
- return
- }
- for i := 0; i < len(keys); i++ {
- if utility.IsEven(i) {
- models = append(models, Models{Member: keys[i], Score: keys[i+1]})
- }
- }
- j.compression(key, models)
- //config.Redis.Del(key)
- }
- func (j *jBackupRedis) cleanZSet(key string) {
- logrus.Info("cleanZSet 正在清理: ", key)
- type Models struct {
- Member string `json:"member"`
- Score string `json:"score"`
- }
- var (
- err error
- cursor uint64 = 0
- match = ""
- count int64 = 20000
- models []Models
- )
- keys, cursor, err := config.GameRedis.ZScan(key, cursor, match, count).Result()
- if len(keys) == 0 {
- logrus.Info(key, "不存在已跳过..")
- return
- }
- if err != nil {
- logrus.Info("ZScan err:", key, err)
- return
- }
- for i := 0; i < len(keys); i++ {
- if utility.IsEven(i) {
- models = append(models, Models{Member: keys[i], Score: keys[i+1]})
- }
- }
- j.compression(key, models)
- //config.Redis.Del(key)
- }
- // compression 统一压缩处理
- func (j *jBackupRedis) compression(key string, models interface{}) {
- bytes, err := json.Marshal(models)
- if err != nil {
- logrus.Infof("json.Marshal err:%v", err)
- return
- }
- fileName, gzFilePath := j.getCompressPath(key)
- if err = compress.DoGzip(bytes, gzFilePath, fileName); err != nil {
- logrus.Infof("compress.DoGzip err:%v", err)
- return
- }
- }
- func (j *jBackupRedis) createDir() {
- utility.CreateDir(os.Getenv("BACKUP_PATH") + RedisBackupPath)
- }
- // getCompressPath 获取压缩路径
- func (j *jBackupRedis) getCompressPath(key string) (fileName, gzFilePath string) {
- fileName = key + ".json"
- gzFilePath = os.Getenv("BACKUP_PATH") + RedisBackupPath + key + ".gz"
- return
- }
- // refreshDownloadList 刷新下载列表
- func (j *jBackupRedis) refreshDownloadList() {
- var (
- downloadJsonPath = os.Getenv("BACKUP_PATH") + RedisBackupPath + "download.json"
- files []string
- )
- file, err := os.OpenFile(downloadJsonPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644)
- if err != nil {
- logrus.Errorf("文件错误,错误为:%v\n", err)
- return
- }
- defer file.Close()
- err = filepath.Walk(os.Getenv("BACKUP_PATH"), func(pat string, info os.FileInfo, err error) error {
- if path.Ext(info.Name()) == ".gz" {
- files = append(files, info.Name())
- }
- return nil
- })
- if err != nil {
- logrus.Errorf("filepath.Walk err:%v\n", err)
- return
- }
- bytes, err := json.Marshal(files)
- if err != nil {
- logrus.Errorf("json.Marshal err:%v\n", err)
- return
- }
- if _, err = file.Write(bytes); err != nil {
- logrus.Errorf("file.Write err:%v\n", err)
- return
- }
- logrus.Infof("刷新下载列表:%+v", files)
- }
|