gtoken_cache.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package gtoken
  2. import (
  3. "context"
  4. "github.com/gogf/gf/v2/encoding/gjson"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gcache"
  7. "github.com/gogf/gf/v2/os/gfile"
  8. "github.com/gogf/gf/v2/util/gconv"
  9. "time"
  10. )
  11. // setCache 设置缓存
  12. func (m *GfToken) setCache(ctx context.Context, cacheKey string, userCache g.Map) Resp {
  13. switch m.CacheMode {
  14. case CacheModeCache, CacheModeFile:
  15. gcache.Set(ctx, cacheKey, userCache, gconv.Duration(m.Timeout)*time.Millisecond)
  16. if m.CacheMode == CacheModeFile {
  17. m.writeFileCache(ctx)
  18. }
  19. case CacheModeRedis:
  20. cacheValueJson, err1 := gjson.Encode(userCache)
  21. if err1 != nil {
  22. g.Log().Error(ctx, "[GToken]cache json encode error", err1)
  23. return Error("cache json encode error")
  24. }
  25. _, err := g.Redis().Do(ctx, "SETEX", cacheKey, m.Timeout/1000, cacheValueJson)
  26. if err != nil {
  27. g.Log().Error(ctx, "[GToken]cache set error", err)
  28. return Error("cache set error")
  29. }
  30. default:
  31. return Error("cache model error")
  32. }
  33. return Succ(userCache)
  34. }
  35. // getCache 获取缓存
  36. func (m *GfToken) getCache(ctx context.Context, cacheKey string) Resp {
  37. var userCache g.Map
  38. switch m.CacheMode {
  39. case CacheModeCache, CacheModeFile:
  40. userCacheValue, err := gcache.Get(ctx, cacheKey)
  41. if err != nil {
  42. g.Log().Error(ctx, "[GToken]cache get error", err)
  43. return Error("cache get error")
  44. }
  45. if userCacheValue.IsNil() {
  46. return Unauthorized("login timeout or not login", "")
  47. }
  48. userCache = gconv.Map(userCacheValue)
  49. case CacheModeRedis:
  50. userCacheJson, err := g.Redis().Do(ctx, "GET", cacheKey)
  51. if err != nil {
  52. g.Log().Error(ctx, "[GToken]cache get error", err)
  53. return Error("cache get error")
  54. }
  55. if userCacheJson.IsNil() {
  56. return Unauthorized("login timeout or not login", "")
  57. }
  58. err = gjson.DecodeTo(userCacheJson, &userCache)
  59. if err != nil {
  60. g.Log().Error(ctx, "[GToken]cache get json error", err)
  61. return Error("cache get json error")
  62. }
  63. default:
  64. return Error("cache model error")
  65. }
  66. return Succ(userCache)
  67. }
  68. // removeCache 删除缓存
  69. func (m *GfToken) removeCache(ctx context.Context, cacheKey string) Resp {
  70. switch m.CacheMode {
  71. case CacheModeCache, CacheModeFile:
  72. _, err := gcache.Remove(ctx, cacheKey)
  73. if err != nil {
  74. g.Log().Error(ctx, err)
  75. }
  76. if m.CacheMode == CacheModeFile {
  77. m.writeFileCache(ctx)
  78. }
  79. case CacheModeRedis:
  80. var err error
  81. _, err = g.Redis().Do(ctx, "DEL", cacheKey)
  82. if err != nil {
  83. g.Log().Error(ctx, "[GToken]cache remove error", err)
  84. return Error("cache remove error")
  85. }
  86. default:
  87. return Error("cache model error")
  88. }
  89. return Succ("")
  90. }
  91. func (m *GfToken) writeFileCache(ctx context.Context) {
  92. file := gfile.Temp(CacheModeFileDat)
  93. data, e := gcache.Data(ctx)
  94. if e != nil {
  95. g.Log().Error(ctx, "[GToken]cache writeFileCache error", e)
  96. }
  97. gfile.PutContents(file, gjson.New(data).MustToJsonString())
  98. }
  99. func (m *GfToken) initFileCache(ctx context.Context) {
  100. file := gfile.Temp(CacheModeFileDat)
  101. if !gfile.Exists(file) {
  102. return
  103. }
  104. data := gfile.GetContents(file)
  105. maps := gconv.Map(data)
  106. if maps == nil || len(maps) <= 0 {
  107. return
  108. }
  109. for k, v := range maps {
  110. gcache.Set(ctx, k, v, gconv.Duration(m.Timeout)*time.Millisecond)
  111. }
  112. }