redis.go 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. package dao
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/app/interface/main/playlist/model"
  6. "go-common/library/cache/redis"
  7. "go-common/library/log"
  8. )
  9. const (
  10. _plArcKey = "pla_%d"
  11. _plArcDescKey = "plad_%d"
  12. )
  13. func keyPlArc(pid int64) string {
  14. return fmt.Sprintf(_plArcKey, pid)
  15. }
  16. func keyPlArcDesc(pid int64) string {
  17. return fmt.Sprintf(_plArcDescKey, pid)
  18. }
  19. // ArcsCache get playlist archives cache.
  20. func (d *Dao) ArcsCache(c context.Context, pid int64, start, end int) (arcs []*model.ArcSort, err error) {
  21. var (
  22. plakey = keyPlArc(pid)
  23. pladKey = keyPlArcDesc(pid)
  24. conn = d.redis.Get(c)
  25. aids []int64
  26. descs []string
  27. )
  28. defer conn.Close()
  29. values, err := redis.Values(conn.Do("ZRANGE", plakey, start, end, "WITHSCORES"))
  30. if err != nil {
  31. log.Error("conn.Do(ZREVRANGE, %s) error(%v)", plakey, err)
  32. return
  33. }
  34. if len(values) == 0 {
  35. return
  36. }
  37. arcMap := make(map[int64]*model.ArcSort)
  38. args := redis.Args{}.Add(pladKey)
  39. for len(values) > 0 {
  40. arc := &model.ArcSort{}
  41. if values, err = redis.Scan(values, &arc.Aid, &arc.Sort); err != nil {
  42. log.Error("redis.Scan(%v) error(%v)", values, err)
  43. return
  44. }
  45. arcMap[arc.Aid] = arc
  46. aids = append(aids, arc.Aid)
  47. args = args.Add(arc.Aid)
  48. }
  49. if len(aids) > 0 {
  50. descs, err = redis.Strings(conn.Do("HMGET", args...))
  51. if err != nil {
  52. log.Error("conn.Do(HMGET %v) error(%v)", args, err)
  53. err = nil
  54. }
  55. descLen := len(descs)
  56. for k, aid := range aids {
  57. if arc, ok := arcMap[aid]; ok {
  58. if descLen >= k+1 {
  59. if desc := descs[k]; desc != "" {
  60. arc.Desc = desc
  61. }
  62. }
  63. arcs = append(arcs, arc)
  64. }
  65. }
  66. }
  67. return
  68. }
  69. // AddArcCache add playlist archive cache.
  70. func (d *Dao) AddArcCache(c context.Context, pid int64, arc *model.ArcSort) (err error) {
  71. var (
  72. plakey = keyPlArc(pid)
  73. pladKey = keyPlArcDesc(pid)
  74. conn = d.redis.Get(c)
  75. count int
  76. )
  77. defer conn.Close()
  78. if _, err = redis.Bool(conn.Do("EXPIRE", plakey, d.plExpire)); err != nil {
  79. log.Error("conn.Do(EXPIRE %s) error(%v)", plakey, err)
  80. return
  81. }
  82. if _, err = redis.Bool(conn.Do("EXPIRE", pladKey, d.plExpire)); err != nil {
  83. log.Error("conn.Do(EXPIRE %s) error(%v)", pladKey, err)
  84. return
  85. }
  86. args1 := redis.Args{}.Add(plakey)
  87. args1 = args1.Add(arc.Sort).Add(arc.Aid)
  88. if err = conn.Send("ZADD", args1...); err != nil {
  89. log.Error("conn.Send(ZADD, %s, %v) error(%v)", plakey, args1, err)
  90. return
  91. }
  92. count++
  93. if arc.Desc != "" {
  94. args2 := redis.Args{}.Add(pladKey).Add(arc.Aid).Add(arc.Desc)
  95. if err = conn.Send("HSET", args2...); err != nil {
  96. log.Error("conn.Send(ZADD, %s, %v) error(%v)", plakey, args2, err)
  97. return
  98. }
  99. count++
  100. if err = conn.Send("EXPIRE", pladKey, d.plExpire); err != nil {
  101. log.Error("conn.Send(Expire, %s) error(%v)", pladKey, err)
  102. return
  103. }
  104. count++
  105. }
  106. if err = conn.Send("EXPIRE", plakey, d.plExpire); err != nil {
  107. log.Error("conn.Send(Expire, %s) error(%v)", pladKey, err)
  108. return
  109. }
  110. if err = conn.Flush(); err != nil {
  111. log.Error("conn.Flush error(%v)", err)
  112. return
  113. }
  114. for i := 0; i < count; i++ {
  115. if _, err = conn.Receive(); err != nil {
  116. log.Error("conn.Receive() error(%v)", err)
  117. return
  118. }
  119. }
  120. return
  121. }
  122. // SetArcsCache set playlist archives cache.
  123. func (d *Dao) SetArcsCache(c context.Context, pid int64, arcs []*model.ArcSort) (err error) {
  124. var (
  125. plaKey = keyPlArc(pid)
  126. pladKey = keyPlArcDesc(pid)
  127. conn = d.redis.Get(c)
  128. addDesc bool
  129. count int
  130. )
  131. defer conn.Close()
  132. if _, err = redis.Bool(conn.Do("EXPIRE", plaKey, d.plExpire)); err != nil {
  133. log.Error("conn.Do(EXPIRE %s) error(%v)", plaKey, err)
  134. return
  135. }
  136. if _, err = redis.Bool(conn.Do("EXPIRE", pladKey, d.plExpire)); err != nil {
  137. log.Error("conn.Do(EXPIRE %s) error(%v)", plaKey, err)
  138. return
  139. }
  140. args1 := redis.Args{}.Add(plaKey)
  141. args2 := redis.Args{}.Add(pladKey)
  142. for _, arc := range arcs {
  143. args1 = args1.Add(arc.Sort).Add(arc.Aid)
  144. if arc.Desc != "" {
  145. addDesc = true
  146. args2 = args2.Add(arc.Aid).Add(arc.Desc)
  147. }
  148. }
  149. if err = conn.Send("ZADD", args1...); err != nil {
  150. log.Error("conn.Send(ZADD, %s, %v) error(%v)", plaKey, args1, err)
  151. return
  152. }
  153. count++
  154. if addDesc {
  155. if err = conn.Send("HMSET", args2...); err != nil {
  156. log.Error("conn.Send(ZADD, %s, %v) error(%v)", pladKey, args2, err)
  157. return
  158. }
  159. count++
  160. }
  161. if err = conn.Send("EXPIRE", pladKey, d.plExpire); err != nil {
  162. log.Error("conn.Send(Expire, %s) error(%v)", pladKey, err)
  163. return
  164. }
  165. count++
  166. if err = conn.Send("EXPIRE", plaKey, d.plExpire); err != nil {
  167. log.Error("conn.Send(Expire, %s) error(%v)", plaKey, err)
  168. return
  169. }
  170. count++
  171. if err = conn.Flush(); err != nil {
  172. log.Error("conn.Flush error(%v)", err)
  173. return
  174. }
  175. for i := 0; i < count; i++ {
  176. if _, err = conn.Receive(); err != nil {
  177. log.Error("conn.Receive() error(%v)", err)
  178. return
  179. }
  180. }
  181. return
  182. }
  183. // SetArcDescCache set playlist archive desc cache.
  184. func (d *Dao) SetArcDescCache(c context.Context, pid, aid int64, desc string) (err error) {
  185. var (
  186. key = keyPlArcDesc(pid)
  187. conn = d.redis.Get(c)
  188. )
  189. defer conn.Close()
  190. if _, err = redis.Bool(conn.Do("EXPIRE", key, d.plExpire)); err != nil {
  191. log.Error("conn.Do(EXPIRE %s) error(%v)", key, err)
  192. return
  193. }
  194. if err = conn.Send("HSET", key, aid, desc); err != nil {
  195. log.Error("conn.Send(HSET, %s, %d, %s) error(%v)", key, aid, desc, err)
  196. return
  197. }
  198. if err = conn.Send("EXPIRE", key, d.plExpire); err != nil {
  199. log.Error("conn.Send(Expire, %s) error(%v)", key, err)
  200. return
  201. }
  202. if err = conn.Flush(); err != nil {
  203. log.Error("conn.Flush error(%v)", err)
  204. return
  205. }
  206. for i := 0; i < 2; i++ {
  207. if _, err = conn.Receive(); err != nil {
  208. log.Error("conn.Receive() error(%v)", err)
  209. return
  210. }
  211. }
  212. return
  213. }
  214. // DelArcsCache delete playlist archives cache.
  215. func (d *Dao) DelArcsCache(c context.Context, pid int64, aids []int64) (err error) {
  216. var (
  217. plaKey = keyPlArc(pid)
  218. pladKey = keyPlArcDesc(pid)
  219. conn = d.redis.Get(c)
  220. )
  221. defer conn.Close()
  222. arg1 := redis.Args{}.Add(plaKey)
  223. arg2 := redis.Args{}.Add(pladKey)
  224. for _, aid := range aids {
  225. arg1 = arg1.Add(aid)
  226. arg2 = arg2.Add(aid)
  227. }
  228. if err = conn.Send("ZREM", arg1...); err != nil {
  229. log.Error("conn.Send(ZREM %s) error(%v)", plaKey, err)
  230. return
  231. }
  232. if err = conn.Send("HDEL", arg2...); err != nil {
  233. log.Error("conn.Send(HDEL %s) error(%v)", pladKey, err)
  234. return
  235. }
  236. if err = conn.Flush(); err != nil {
  237. log.Error("conn.Flush() error(%v)", err)
  238. return
  239. }
  240. for i := 0; i < 2; i++ {
  241. if _, err = conn.Receive(); err != nil {
  242. log.Error("conn.Receive() error(%v)", err)
  243. return
  244. }
  245. }
  246. return
  247. }
  248. // DelCache del all cache .
  249. func (d *Dao) DelCache(c context.Context, pid int64) (err error) {
  250. var (
  251. plaKey = keyPlArc(pid)
  252. pladKey = keyPlArcDesc(pid)
  253. conn = d.redis.Get(c)
  254. )
  255. defer conn.Close()
  256. if err = conn.Send("DEL", plaKey); err != nil {
  257. log.Error("conn.Send(DEL plaKey(%s) error(%v))", plaKey, err)
  258. return
  259. }
  260. if err = conn.Send("DEL", pladKey); err != nil {
  261. log.Error("conn.Send(DEL pladKey(%s) error(%v))", pladKey, err)
  262. return
  263. }
  264. if err = conn.Flush(); err != nil {
  265. log.Error("conn.Flush() error(%v)", err)
  266. return
  267. }
  268. for i := 0; i < 2; i++ {
  269. if _, err = conn.Receive(); err != nil {
  270. log.Error("conn.Receive() error(%v)", err)
  271. return
  272. }
  273. }
  274. return
  275. }