redis.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package dao
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/library/cache/redis"
  6. "go-common/library/ecode"
  7. "go-common/library/log"
  8. )
  9. const (
  10. // dm xml list v1
  11. _prefixDM = "dm_v1_%d_%d" // dm_v1_type_oid
  12. _broadcastLimitFmt = "b_room_%d_%d" // b_room_type_oid
  13. )
  14. func keyDM(tp int32, oid int64) (key string) {
  15. return fmt.Sprintf(_prefixDM, tp, oid)
  16. }
  17. func keyBroadcastLimit(tp int32, oid int64) (key string) {
  18. return fmt.Sprintf(_broadcastLimitFmt, tp, oid)
  19. }
  20. // DMCache 获取redis列表中的弹幕.
  21. func (d *Dao) DMCache(c context.Context, tp int32, oid int64) (res [][]byte, err error) {
  22. conn := d.dmRds.Get(c)
  23. key := keyDM(tp, oid)
  24. if res, err = redis.ByteSlices(conn.Do("ZRANGE", key, 0, -1)); err != nil {
  25. log.Error("conn.Do(ZRANGE %s) error(%v)", key, err)
  26. }
  27. conn.Close()
  28. return
  29. }
  30. // ExpireDMCache expire dm.
  31. func (d *Dao) ExpireDMCache(c context.Context, tp int32, oid int64) (ok bool, err error) {
  32. key := keyDM(tp, oid)
  33. conn := d.dmRds.Get(c)
  34. if ok, err = redis.Bool(conn.Do("EXPIRE", key, d.dmRdsExpire)); err != nil {
  35. log.Error("conn.Do(EXPIRE %s) error(%v)", key, err)
  36. }
  37. conn.Close()
  38. return
  39. }
  40. // TrimDMCache 从redis列表中pop掉count条弹幕.
  41. func (d *Dao) TrimDMCache(c context.Context, tp int32, oid, count int64) (err error) {
  42. conn := d.dmRds.Get(c)
  43. key := keyDM(tp, oid)
  44. if _, err = conn.Do("ZREMRANGEBYRANK", key, 0, count-1); err != nil {
  45. log.Error("conn.Do(ZREMRANGEBYRANK %s) error(%v)", key, err)
  46. }
  47. conn.Close()
  48. return
  49. }
  50. // IncrPubCnt increase pub count of user.
  51. func (d *Dao) IncrPubCnt(c context.Context, mid, color int64, mode, fontsize int32, ip, msg string) (err error) {
  52. conn := d.dmRds.Get(c)
  53. defer conn.Close()
  54. key := keyPubCntLock(mid, color, mode, fontsize, ip, msg)
  55. if err = conn.Send("INCR", key); err != nil {
  56. log.Error("conn.Send(INCR %s) error(%v)", key, err)
  57. return
  58. }
  59. if err = conn.Send("EXPIRE", key, 300); err != nil {
  60. log.Error("conn.Send(EXPIRE %s) error(%v)", key, err)
  61. return
  62. }
  63. if err = conn.Flush(); err != nil {
  64. log.Error("conn.Flush() error(%v)", err)
  65. return
  66. }
  67. for i := 0; i < 2; i++ {
  68. if _, err = conn.Receive(); err != nil {
  69. log.Error("conn.Receive() error(%v)", err)
  70. return
  71. }
  72. }
  73. return
  74. }
  75. // PubCnt get dm pub count of user.
  76. func (d *Dao) PubCnt(c context.Context, mid, color int64, mode, fontsize int32, ip, msg string) (count int64, err error) {
  77. conn := d.dmRds.Get(c)
  78. defer conn.Close()
  79. key := keyPubCntLock(mid, color, mode, fontsize, ip, msg)
  80. if count, err = redis.Int64(conn.Do("GET", key)); err != nil {
  81. if err == redis.ErrNil {
  82. err = nil
  83. } else {
  84. log.Error("conn.Do(GET %s) error(%v)", key, err)
  85. }
  86. return
  87. }
  88. return
  89. }
  90. // IncrCharPubCnt increase character pub count of user.
  91. func (d *Dao) IncrCharPubCnt(c context.Context, mid, oid int64) (err error) {
  92. conn := d.dmRds.Get(c)
  93. defer conn.Close()
  94. key := keyCharPubLock(mid, oid)
  95. if err = conn.Send("INCR", key); err != nil {
  96. log.Error("conn.Send(INCR %s) error(%v)", key, err)
  97. return
  98. }
  99. if err = conn.Send("EXPIRE", key, 60); err != nil {
  100. log.Error("conn.Send(EXPIRE %s) error(%v)", key, err)
  101. return
  102. }
  103. if err = conn.Flush(); err != nil {
  104. log.Error("conn.Flush() error(%v)", err)
  105. return
  106. }
  107. for i := 0; i < 2; i++ {
  108. if _, err = conn.Receive(); err != nil {
  109. log.Error("conn.Receive() error(%v)", err)
  110. return
  111. }
  112. }
  113. return
  114. }
  115. // CharPubCnt get character pub count of user.
  116. func (d *Dao) CharPubCnt(c context.Context, mid, oid int64) (count int64, err error) {
  117. conn := d.dmRds.Get(c)
  118. defer conn.Close()
  119. key := keyCharPubLock(mid, oid)
  120. if count, err = redis.Int64(conn.Do("GET", key)); err != nil {
  121. if err == redis.ErrNil {
  122. err = nil
  123. } else {
  124. log.Error("conn.Do(GET %s) error(%v)", key, err)
  125. }
  126. return
  127. }
  128. return
  129. }
  130. // DelCharPubCnt delete char
  131. func (d *Dao) DelCharPubCnt(c context.Context, mid, oid int64) (err error) {
  132. conn := d.dmRds.Get(c)
  133. key := keyCharPubLock(mid, oid)
  134. if _, err = conn.Do("DEL", key); err != nil {
  135. log.Error("conn.Do(DEL %s) error(%v)", key, err)
  136. }
  137. conn.Close()
  138. return
  139. }
  140. // BroadcastLimit .
  141. func (d *Dao) BroadcastLimit(c context.Context, oid int64, tp int32, count, interval int) (err error) {
  142. conn := d.dmRds.Get(c)
  143. key := keyBroadcastLimit(tp, oid)
  144. defer conn.Close()
  145. incred, err := redis.Int64(conn.Do("INCR", key))
  146. if err != nil {
  147. return nil
  148. }
  149. if incred == 1 {
  150. conn.Do("EXPIRE", key, interval)
  151. }
  152. if incred > int64(count) {
  153. return ecode.LimitExceed
  154. }
  155. return
  156. }