redis.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. package dao
  2. import (
  3. "context"
  4. "strconv"
  5. "time"
  6. "go-common/library/cache/redis"
  7. "go-common/library/log"
  8. )
  9. const (
  10. _rptCnt = "rc_"
  11. _rptBrig = "rb_"
  12. _prfxPaUsrCntKey = "pa_user_count_"
  13. _prfxUdAccCntKey = "usr_dm_acc_cnt_"
  14. _prfxRecallCntKey = "recall_cnt_"
  15. _crontabRedisLock = "crontab_redis_lock"
  16. _crontabRedisLockExpire = 2 * 3600
  17. )
  18. // tomorrowUnixTime 明天unix time
  19. func tomorrowUnixTime() int64 {
  20. tomorrow := time.Now().Add(24 * time.Hour)
  21. year, month, day := tomorrow.Date()
  22. return time.Date(year, month, day, 0, 0, 0, 0, time.Local).Unix()
  23. }
  24. // paUsrCntKey 用户申请保护弹幕计数 redis key
  25. func keyProtectApplyCmt() string {
  26. return _prfxPaUsrCntKey + time.Now().Format("20060102")
  27. }
  28. func keyRptCnt() string {
  29. return _rptCnt + time.Now().Format("04")
  30. }
  31. func keyRptBrig(mid int64) string {
  32. return _rptBrig + strconv.FormatInt(mid, 10)
  33. }
  34. func keyRecallCnt() string {
  35. return _prfxRecallCntKey + time.Now().Format("20060102")
  36. }
  37. // UptUsrPaCnt 设置申请保护弹幕数
  38. func (d *Dao) UptUsrPaCnt(c context.Context, uid int64, count int64) (err error) {
  39. var (
  40. key, expire = keyProtectApplyCmt(), tomorrowUnixTime()
  41. conn = d.redisDM.Get(c)
  42. )
  43. defer conn.Close()
  44. if err = conn.Send("ZINCRBY", key, count, uid); err != nil {
  45. log.Error("conn.Send(ZADD,%s,%d,%d) error(%v)", key, count, uid, err)
  46. return
  47. }
  48. if err = conn.Send("EXPIREAT", key, expire); err != nil {
  49. log.Error("conn.Send(EXPIREAT key(%s) expire(%d)) error(%v)", key, expire, err)
  50. return
  51. }
  52. if err = conn.Flush(); err != nil {
  53. log.Error("conn.Flush error(%v)", err)
  54. return
  55. }
  56. for i := 0; i < 2; i++ {
  57. if _, err = conn.Receive(); err != nil {
  58. log.Error("conn.Receive error(%v)", err)
  59. return
  60. }
  61. }
  62. return
  63. }
  64. // PaUsrCnt 保护弹幕申请计数
  65. func (d *Dao) PaUsrCnt(c context.Context, uid int64) (cnt int, err error) {
  66. var (
  67. key = keyProtectApplyCmt()
  68. conn = d.redisDM.Get(c)
  69. )
  70. defer conn.Close()
  71. if cnt, err = redis.Int(conn.Do("ZSCORE", key, uid)); err != nil {
  72. if err == redis.ErrNil {
  73. err = nil
  74. } else {
  75. log.Error("conn.Do(ZSCORE, %s,%d) error(%v)", key, uid, err)
  76. }
  77. }
  78. return
  79. }
  80. // UsrDMAccCnt 我的弹幕访问计数
  81. func (d *Dao) UsrDMAccCnt(c context.Context, uid int64, t int64) (cnt int64, err error) {
  82. var (
  83. key = _prfxUdAccCntKey + strconv.FormatInt(uid, 10)
  84. conn = d.redisDM.Get(c)
  85. )
  86. defer conn.Close()
  87. if cnt, err = redis.Int64(conn.Do("INCRBY", key, t)); err != nil {
  88. log.Error("conn.Do(INCRBY, %s,%d) error(%v)", key, t, err)
  89. return
  90. }
  91. if cnt != t {
  92. return
  93. }
  94. _, err = redis.Int(conn.Do("EXPIREAT", key, t+5))
  95. if err != nil {
  96. log.Error("conn.Do(EXPIREAT, %s,%d) error(%v)", key, t+5, err)
  97. }
  98. return
  99. }
  100. // RecallCnt 撤回弹幕计数
  101. func (d *Dao) RecallCnt(c context.Context, uid int64) (cnt int, err error) {
  102. var (
  103. key = keyRecallCnt()
  104. conn = d.redisDM.Get(c)
  105. )
  106. defer conn.Close()
  107. if cnt, err = redis.Int(conn.Do("ZSCORE", key, uid)); err != nil {
  108. if err == redis.ErrNil {
  109. err = nil
  110. } else {
  111. log.Error("redis.Int(conn.Do(GET, %s,%d)) error(%v)", key, uid, err)
  112. }
  113. }
  114. return
  115. }
  116. // UptRecallCnt 更新撤回弹幕计数
  117. func (d *Dao) UptRecallCnt(c context.Context, uid int64) (err error) {
  118. var (
  119. key = keyRecallCnt()
  120. conn = d.redisDM.Get(c)
  121. )
  122. defer conn.Close()
  123. if err = conn.Send("ZINCRBY", key, 1, uid); err != nil {
  124. log.Error("conn.Send(ZINCRBY, %s,%d) error(%v)", key, 1, err)
  125. return
  126. }
  127. if err = conn.Send("EXPIRE", key, 3600*24); err != nil {
  128. log.Error("conn.Send(EXPIRE, %s,%d) error(%v)", key, 3600*24, err)
  129. return
  130. }
  131. if err = conn.Flush(); err != nil {
  132. log.Error("conn.Flush() error(%v)", err)
  133. return
  134. }
  135. for i := 0; i < 2; i++ {
  136. if _, err = conn.Receive(); err != nil {
  137. log.Error("conn.Receive() error(%v)", err)
  138. return
  139. }
  140. }
  141. return
  142. }
  143. // PaLock redis定时任务锁,保证只有一个地方在执行定时任务
  144. func (d *Dao) PaLock(c context.Context, key string) (incr int, err error) {
  145. var (
  146. conn = d.redisDM.Get(c)
  147. r interface{}
  148. )
  149. key = _crontabRedisLock + key
  150. defer conn.Close()
  151. if err = conn.Send("INCRBY", key, 1); err != nil {
  152. log.Error("conn.Send(INCRBY,%s) error(%v)", key, err)
  153. return
  154. }
  155. if err = conn.Send("EXPIRE", key, _crontabRedisLockExpire); err != nil {
  156. log.Error("conn.Send(EXPIRE key(%s) expire(%d)) error(%v)", key, _crontabRedisLockExpire, err)
  157. return
  158. }
  159. if err = conn.Flush(); err != nil {
  160. log.Error("conn.Flush error(%v)", err)
  161. return
  162. }
  163. if r, err = conn.Receive(); err != nil {
  164. log.Error("conn.Receive error(%v)", err)
  165. return
  166. }
  167. if incr, err = redis.Int(r, err); err != nil {
  168. log.Error("redis.Int error(%v)", err)
  169. return
  170. }
  171. if _, err = conn.Receive(); err != nil {
  172. log.Error("conn.Receive error(%v)", err)
  173. }
  174. return
  175. }
  176. // RptCnt 弹幕举报一分钟计数
  177. func (d *Dao) RptCnt(c context.Context, uid int64) (n int, err error) {
  178. var (
  179. k = keyRptCnt()
  180. conn = d.redisDM.Get(c)
  181. )
  182. if n, err = redis.Int(conn.Do("ZSCORE", k, uid)); err != nil {
  183. if err == redis.ErrNil {
  184. err = nil
  185. } else {
  186. log.Error("conn.Do(ZSCORE, %s,%d) error(%v)", k, uid, err)
  187. }
  188. }
  189. conn.Close()
  190. return
  191. }
  192. // UptRptCnt 更新一分钟的弹幕举报数
  193. func (d *Dao) UptRptCnt(c context.Context, uid int64) (n int64, err error) {
  194. var (
  195. k = keyRptCnt()
  196. conn = d.redisDM.Get(c)
  197. )
  198. defer conn.Close()
  199. if err = conn.Send("ZINCRBY", k, 1, uid); err != nil {
  200. log.Error("conn.Send(ZINCRBY, %s,%d) error(%v)", k, 1, err)
  201. return
  202. }
  203. if err = conn.Send("EXPIRE", k, 60); err != nil {
  204. log.Error("conn.Send(EXPIRE, %s,%d) error(%v)", k, 60, err)
  205. return
  206. }
  207. if err = conn.Flush(); err != nil {
  208. log.Error("conn.Flush() error(%v)", err)
  209. return
  210. }
  211. for i := 0; i < 2; i++ {
  212. if _, err = conn.Receive(); err != nil {
  213. log.Error("conn.Receive() error(%v)", err)
  214. return
  215. }
  216. }
  217. return
  218. }
  219. // AddRptBrig 将用户禁闭,30分钟不让举报
  220. func (d *Dao) AddRptBrig(c context.Context, mid int64) (err error) {
  221. var (
  222. k = keyRptBrig(mid)
  223. conn = d.redisDM.Get(c)
  224. )
  225. if _, err = conn.Do("SETEX", k, 1800, time.Now().Unix()); err != nil {
  226. log.Error("conn.Do(SETEX, %s,%d) error(%v)", k, 1, err)
  227. }
  228. conn.Close()
  229. return
  230. }
  231. // RptBrigTime 获得禁闭的开始时间
  232. func (d *Dao) RptBrigTime(c context.Context, mid int64) (t int64, err error) {
  233. var (
  234. k = keyRptBrig(mid)
  235. conn = d.redisDM.Get(c)
  236. )
  237. if t, err = redis.Int64(conn.Do("GET", k)); err != nil {
  238. if err == redis.ErrNil {
  239. err = nil
  240. } else {
  241. log.Error("conn.Do(GET, %s,%d) error(%v)", k, 1, err)
  242. }
  243. }
  244. conn.Close()
  245. return
  246. }