cache.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. package unicom
  2. import (
  3. "context"
  4. "fmt"
  5. "go-common/app/interface/main/app-wall/model/unicom"
  6. "go-common/library/cache/memcache"
  7. "go-common/library/log"
  8. )
  9. const (
  10. _prefix = "unicoms_user_%v"
  11. _userbindkey = "unicoms_user_bind_%d"
  12. _userpackkey = "unicom_user_pack_%d"
  13. _userflowkey = "unicom_user_flow_%v"
  14. _userflowlistkey = "unicom_user_flow_list"
  15. _userflowWait = "u_flowwait_%d"
  16. )
  17. func keyUnicom(usermob string) string {
  18. return fmt.Sprintf(_prefix, usermob)
  19. }
  20. func keyUserBind(mid int64) string {
  21. return fmt.Sprintf(_userbindkey, mid)
  22. }
  23. func keyUserPack(id int64) string {
  24. return fmt.Sprintf(_userpackkey, id)
  25. }
  26. func keyUserFlow(key string) string {
  27. return fmt.Sprintf(_userflowkey, key)
  28. }
  29. func keyUserflowWait(phone int) string {
  30. return fmt.Sprintf(_userflowWait, phone)
  31. }
  32. // AddUnicomCache
  33. func (d *Dao) AddUnicomCache(c context.Context, usermob string, u []*unicom.Unicom) (err error) {
  34. var (
  35. key = keyUnicom(usermob)
  36. conn = d.mc.Get(c)
  37. )
  38. if err = conn.Set(&memcache.Item{Key: key, Object: u, Flags: memcache.FlagJSON, Expiration: d.expire}); err != nil {
  39. log.Error("addUnicomCache d.mc.Set(%s,%v) error(%v)", key, u, err)
  40. }
  41. conn.Close()
  42. return
  43. }
  44. // UnicomCache
  45. func (d *Dao) UnicomCache(c context.Context, usermob string) (u []*unicom.Unicom, err error) {
  46. var (
  47. key = keyUnicom(usermob)
  48. conn = d.mc.Get(c)
  49. r *memcache.Item
  50. )
  51. defer conn.Close()
  52. if r, err = conn.Get(key); err != nil {
  53. log.Error("unicomCache MemchDB.Get(%s) error(%v)", key, err)
  54. return
  55. }
  56. if err = conn.Scan(r, &u); err != nil {
  57. log.Error("r.Scan(%s) error(%v)", r.Value, err)
  58. }
  59. return
  60. }
  61. // UpdateUnicomCache
  62. func (d *Dao) UpdateUnicomCache(c context.Context, usermob string, u *unicom.Unicom) (err error) {
  63. var (
  64. us []*unicom.Unicom
  65. unicoms []*unicom.Unicom
  66. uspid = map[int]struct{}{}
  67. )
  68. if u.Spid == 979 && u.TypeInt == 1 {
  69. return d.DeleteUnicomCache(c, usermob)
  70. }
  71. if us, err = d.UnicomCache(c, usermob); err != nil {
  72. if err == memcache.ErrNotFound {
  73. err = nil
  74. return
  75. }
  76. log.Error("d.UnicomCache error(%v)", err)
  77. return
  78. }
  79. if len(us) > 0 {
  80. for _, um := range us {
  81. if um.Spid == 979 && um.TypeInt == 1 {
  82. return d.DeleteUnicomCache(c, usermob)
  83. }
  84. tmp := &unicom.Unicom{}
  85. *tmp = *um
  86. if tmp.Spid == u.Spid {
  87. tmp = u
  88. uspid[u.Spid] = struct{}{}
  89. }
  90. unicoms = append(unicoms, tmp)
  91. }
  92. if _, ok := uspid[u.Spid]; !ok {
  93. unicoms = append(unicoms, u)
  94. }
  95. if err = d.AddUnicomCache(c, usermob, unicoms); err != nil {
  96. log.Error("d.AddUnicomCache error(%v)", err)
  97. return
  98. }
  99. }
  100. return
  101. }
  102. // DeleteUnicomCache
  103. func (d *Dao) DeleteUnicomCache(c context.Context, usermob string) (err error) {
  104. var (
  105. key = keyUnicom(usermob)
  106. conn = d.mc.Get(c)
  107. )
  108. defer conn.Close()
  109. if err = conn.Delete(key); err != nil {
  110. if err == memcache.ErrNotFound {
  111. err = nil
  112. return
  113. }
  114. log.Error("unicomCache MemchDB.Delete(%s) error(%v)", key, err)
  115. return
  116. }
  117. return
  118. }
  119. // UserBindCache user bind cache
  120. func (d *Dao) UserBindCache(c context.Context, mid int64) (ub *unicom.UserBind, err error) {
  121. var (
  122. key = keyUserBind(mid)
  123. conn = d.mc.Get(c)
  124. r *memcache.Item
  125. )
  126. defer conn.Close()
  127. if r, err = conn.Get(key); err != nil {
  128. log.Error("UserBindCache MemchDB.Get(%s) error(%v)", key, err)
  129. return
  130. }
  131. if err = conn.Scan(r, &ub); err != nil {
  132. log.Error("r.Scan(%s) error(%v)", r.Value, err)
  133. }
  134. return
  135. }
  136. // AddUserBindCache add user user bind cache
  137. func (d *Dao) AddUserBindCache(c context.Context, mid int64, ub *unicom.UserBind) (err error) {
  138. var (
  139. key = keyUserBind(mid)
  140. conn = d.mc.Get(c)
  141. )
  142. if err = conn.Set(&memcache.Item{Key: key, Object: ub, Flags: memcache.FlagJSON, Expiration: 0}); err != nil {
  143. log.Error("AddUserBindCache d.mc.Set(%s,%v) error(%v)", key, ub, err)
  144. }
  145. conn.Close()
  146. return
  147. }
  148. // DeleteUserBindCache delete user bind cache
  149. func (d *Dao) DeleteUserBindCache(c context.Context, mid int64) (err error) {
  150. var (
  151. key = keyUserBind(mid)
  152. conn = d.mc.Get(c)
  153. )
  154. defer conn.Close()
  155. if err = conn.Delete(key); err != nil {
  156. if err == memcache.ErrNotFound {
  157. err = nil
  158. return
  159. }
  160. log.Error("DeleteUserBindCache MemchDB.Delete(%s) error(%v)", key, err)
  161. return
  162. }
  163. return
  164. }
  165. // UserPackCache user packs
  166. func (d *Dao) UserPackCache(c context.Context, id int64) (res *unicom.UserPack, err error) {
  167. var (
  168. key = keyUserPack(id)
  169. conn = d.mc.Get(c)
  170. r *memcache.Item
  171. )
  172. defer conn.Close()
  173. if r, err = conn.Get(key); err != nil {
  174. log.Error("UserBindCache MemchDB.Get(%s) error(%v)", key, err)
  175. return
  176. }
  177. if err = conn.Scan(r, &res); err != nil {
  178. log.Error("r.Scan(%s) error(%v)", r.Value, err)
  179. }
  180. return
  181. }
  182. // AddUserPackCache add user pack cache
  183. func (d *Dao) AddUserPackCache(c context.Context, id int64, u *unicom.UserPack) (err error) {
  184. var (
  185. key = keyUserPack(id)
  186. conn = d.mc.Get(c)
  187. )
  188. if err = conn.Set(&memcache.Item{Key: key, Object: u, Flags: memcache.FlagJSON, Expiration: d.flowKeyExpired}); err != nil {
  189. log.Error("AddUserPackCache d.mc.Set(%s,%v) error(%v)", key, u, err)
  190. }
  191. conn.Close()
  192. return
  193. }
  194. // DeleteUserPackCache delete user pack cache
  195. func (d *Dao) DeleteUserPackCache(c context.Context, id int64) (err error) {
  196. var (
  197. key = keyUserPack(id)
  198. conn = d.mc.Get(c)
  199. )
  200. defer conn.Close()
  201. if err = conn.Delete(key); err != nil {
  202. if err == memcache.ErrNotFound {
  203. err = nil
  204. return
  205. }
  206. log.Error("DeleteUserPackCache MemchDB.Delete(%s) error(%v)", key, err)
  207. return
  208. }
  209. return
  210. }
  211. //UserFlowCache unicom flow cache
  212. func (d *Dao) UserFlowCache(c context.Context, keyStr string) (err error) {
  213. var (
  214. key = keyUserFlow(keyStr)
  215. conn = d.mc.Get(c)
  216. r *memcache.Item
  217. res struct{}
  218. )
  219. defer conn.Close()
  220. if r, err = conn.Get(key); err != nil {
  221. log.Error("UserFlowCache MemchDB.Get(%s) error(%v)", key, err)
  222. return
  223. }
  224. if err = conn.Scan(r, &res); err != nil {
  225. log.Error("r.Scan(%s) error(%v)", r.Value, err)
  226. }
  227. return
  228. }
  229. // AddUserFlowCache add user pack cache
  230. func (d *Dao) AddUserFlowCache(c context.Context, keyStr string) (err error) {
  231. var (
  232. key = keyUserFlow(keyStr)
  233. conn = d.mc.Get(c)
  234. )
  235. if err = conn.Set(&memcache.Item{Key: key, Object: struct{}{}, Flags: memcache.FlagJSON, Expiration: d.flowKeyExpired}); err != nil {
  236. log.Error("AddUserPackCache d.mc.Set(%s) error(%v)", key, err)
  237. }
  238. conn.Close()
  239. return
  240. }
  241. // DeleteUserPackCache delete user pack cache
  242. func (d *Dao) DeleteUserFlowCache(c context.Context, keyStr string) (err error) {
  243. var (
  244. key = keyUserFlow(keyStr)
  245. conn = d.mc.Get(c)
  246. )
  247. defer conn.Close()
  248. if err = conn.Delete(key); err != nil {
  249. if err == memcache.ErrNotFound {
  250. err = nil
  251. return
  252. }
  253. log.Error("DeleteUserFlowCache MemchDB.Delete(%s) error(%v)", key, err)
  254. return
  255. }
  256. return
  257. }
  258. //UserFlowListCache unicom flow cache
  259. func (d *Dao) UserFlowListCache(c context.Context) (res map[string]*unicom.UnicomUserFlow, err error) {
  260. var (
  261. key = _userflowlistkey
  262. conn = d.mc.Get(c)
  263. r *memcache.Item
  264. )
  265. defer conn.Close()
  266. if r, err = conn.Get(key); err != nil {
  267. if err == memcache.ErrNotFound {
  268. err = nil
  269. return
  270. }
  271. log.Error("UserFlowListCache MemchDB.Get(%s) error(%v)", key, err)
  272. return
  273. }
  274. if err = conn.Scan(r, &res); err != nil {
  275. log.Error("r.Scan(%s) error(%v)", r.Value, err)
  276. }
  277. return
  278. }
  279. // AddUserFlowListCache add user pack cache
  280. func (d *Dao) AddUserFlowListCache(c context.Context, list map[string]*unicom.UnicomUserFlow) (err error) {
  281. var (
  282. key = _userflowlistkey
  283. conn = d.mc.Get(c)
  284. )
  285. if err = conn.Set(&memcache.Item{Key: key, Object: list, Flags: memcache.FlagJSON, Expiration: d.flowKeyExpired}); err != nil {
  286. log.Error("AddUserFlowListCache d.mc.Set(%s,%v) error(%v)", key, list, err)
  287. }
  288. conn.Close()
  289. return
  290. }
  291. //UserFlowWaitCache unicom flow wait
  292. func (d *Dao) UserFlowWaitCache(c context.Context, phone int) (err error) {
  293. var (
  294. key = keyUserflowWait(phone)
  295. conn = d.mc.Get(c)
  296. r *memcache.Item
  297. res struct{}
  298. )
  299. defer conn.Close()
  300. if r, err = conn.Get(key); err != nil {
  301. log.Error("UserFlowWaitCache MemchDB.Get(%s) error(%v)", key, err)
  302. return
  303. }
  304. if err = conn.Scan(r, &res); err != nil {
  305. log.Error("r.Scan(%s) error(%v)", r.Value, err)
  306. }
  307. return
  308. }
  309. // AddUserFlowWaitCache add user flow wait
  310. func (d *Dao) AddUserFlowWaitCache(c context.Context, phone int) (err error) {
  311. var (
  312. key = keyUserflowWait(phone)
  313. conn = d.mc.Get(c)
  314. )
  315. if err = conn.Set(&memcache.Item{Key: key, Object: struct{}{}, Flags: memcache.FlagJSON, Expiration: d.flowWait}); err != nil {
  316. log.Error("AddUserFlowWaitCache d.mc.Set(%s) error(%v)", key, err)
  317. }
  318. conn.Close()
  319. return
  320. }