key.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package redisdo
  2. import (
  3. "errors"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "time"
  8. //"github.com/garyburd/redigo/redis"
  9. )
  10. func GetPlayerKey(playerId int64) []byte {
  11. return strconv.AppendInt([]byte("onlineer:"), playerId, 10)
  12. }
  13. func GetGateServerKey(serverId int64) []byte {
  14. return strconv.AppendInt([]byte("gateServer:"), serverId, 10)
  15. }
  16. func scanKeys(st int) (int, []string, error) {
  17. rep, err := Do("scan", st)
  18. if err != nil {
  19. return -1, nil, err
  20. }
  21. rep2 := rep.([]interface{})
  22. if len(rep2) != 2 {
  23. return -1, nil, errors.New("replay length is error")
  24. }
  25. nextSt := -1
  26. if strSt, ok := rep2[0].([]byte); !ok {
  27. return -1, nil, errors.New("replay type is error")
  28. } else {
  29. st, err := strconv.Atoi(string(strSt))
  30. if err != nil {
  31. return -1, nil, err
  32. }
  33. nextSt = st
  34. }
  35. var lst []string
  36. if ks, ok := rep2[1].([]interface{}); !ok {
  37. return -1, nil, errors.New("replay type is error")
  38. } else {
  39. for _, v := range ks {
  40. if nv, ok := v.([]byte); ok {
  41. k := string(nv)
  42. lst = append(lst, k)
  43. }
  44. }
  45. }
  46. return nextSt, lst, nil
  47. }
  48. // 日任务到期 , 幸运抽奖到期 2022-05-01
  49. func checkKeyFormatDate(val string, main string) {
  50. if !strings.HasSuffix(main, ":") {
  51. main += ":"
  52. }
  53. nv := strings.ReplaceAll(val, main, "")
  54. // 日期
  55. lst := strings.Split(nv, "-")
  56. if len(lst) == 3 {
  57. y, _ := strconv.Atoi(lst[0])
  58. m, _ := strconv.Atoi(lst[1])
  59. d, _ := strconv.Atoi(lst[2])
  60. tt := time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Local)
  61. if time.Since(tt) > time.Duration(14*24*time.Hour) {
  62. fmt.Printf("del from redis %v\n", val)
  63. //Do("del", val)
  64. }
  65. }
  66. }
  67. // 古玩排行 20220501
  68. func checkKeyFormatDate2(val string, main string) {
  69. if !strings.HasSuffix(main, ":") {
  70. main += ":"
  71. }
  72. nv := strings.ReplaceAll(val, main, "")
  73. // 日期
  74. dt, _ := strconv.Atoi(nv)
  75. if dt > 20220000 {
  76. y := dt / 10000
  77. m := (dt % 10000) / 100
  78. d := dt % 100
  79. tt := time.Date(y, time.Month(m), d, 0, 0, 0, 0, time.Local)
  80. if time.Since(tt) > time.Duration(14*24*time.Hour) {
  81. fmt.Printf("del from redis %v\n", val)
  82. //Do("del", val)
  83. }
  84. }
  85. }
  86. // pvp key:21
  87. func checkKeyFormatWeek(val string, main string) {
  88. if !strings.HasSuffix(main, ":") {
  89. main += ":"
  90. }
  91. nv := strings.ReplaceAll(val, main, "")
  92. twk, _ := strconv.Atoi(nv)
  93. //星期
  94. // 取当前星期 上星期 上上星期做列表,不在此范围内的都删除
  95. var lst []int
  96. for i := 0; i < 3; i++ {
  97. dn := -7 * i * 24
  98. _, wk := time.Now().Add(time.Duration(dn) * time.Hour).ISOWeek()
  99. lst = append(lst, wk)
  100. }
  101. for _, v := range lst {
  102. if v == twk {
  103. return
  104. }
  105. }
  106. //Do("del", val)
  107. fmt.Println("del from redis", val)
  108. }
  109. func ScanAll() {
  110. process := func(val string) {
  111. if !strings.Contains(val, ":") && !strings.Contains(val, "onlineStat") {
  112. Do("del", val)
  113. return
  114. }
  115. // 个人章节先不处理
  116. if strings.HasPrefix(val, "chapter") {
  117. return
  118. }
  119. if strings.HasPrefix(val, "day_task_v2") {
  120. checkKeyFormatDate(val, "day_task_v2")
  121. return
  122. }
  123. if strings.HasPrefix(val, "luck_draw_v2") {
  124. checkKeyFormatDate(val, "luck_draw_v2")
  125. return
  126. }
  127. // pvp
  128. if strings.HasPrefix(val, "pvpplayers") {
  129. checkKeyFormatWeek(val, "pvpplayers")
  130. return
  131. }
  132. if strings.HasPrefix(val, "pvphistorys") {
  133. checkKeyFormatWeek(val, "pvphistorys")
  134. return
  135. }
  136. if strings.HasPrefix(val, "ranking_pvp") {
  137. checkKeyFormatWeek(val, "ranking_pvp")
  138. return
  139. }
  140. if strings.HasPrefix(val, "pvpmode") {
  141. checkKeyFormatWeek(val, "pvpmode")
  142. return
  143. }
  144. // 无尽
  145. if strings.HasPrefix(val, "ranking_list") {
  146. checkKeyFormatWeek(val, "ranking_list")
  147. return
  148. }
  149. //古玩排行
  150. if strings.HasPrefix(val, "curio_ranking") {
  151. checkKeyFormatDate2(val, "curio_ranking")
  152. return
  153. }
  154. fmt.Println(val)
  155. }
  156. st := 0
  157. for i := 0; i < 1000; i++ {
  158. nst, lst, err := scanKeys(st)
  159. if err != nil {
  160. return
  161. }
  162. fmt.Println("scan pos:", st)
  163. for _, v := range lst {
  164. process(v)
  165. }
  166. st = nst
  167. if st <= 0 {
  168. return
  169. }
  170. }
  171. }