redisapi.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // redis操作接口
  2. // 秒寻科技
  3. // 2024-01-08
  4. // 周涛
  5. package redisapi
  6. import (
  7. "context"
  8. "encoding/json"
  9. "errors"
  10. "ipsomc/util"
  11. "reflect"
  12. "time"
  13. "github.com/go-redis/redis/v8"
  14. )
  15. type RedisApi struct {
  16. }
  17. // redis全局操作对象
  18. var (
  19. ctx context.Context
  20. rdsDb *redis.Client
  21. )
  22. // 打开redis
  23. func OpenRds(c context.Context, item string) error {
  24. ctx = c //保存上下文
  25. viper := util.GetViper()
  26. viper.SetDefault(item, map[string]interface{}{
  27. "address": "127.0.0.1:6379",
  28. "password": "",
  29. "database": 0,
  30. "dialTimeout": 1,
  31. "poolSize": 20,
  32. })
  33. rdsDb = redis.NewClient(&redis.Options{
  34. Addr: viper.GetString(item + ".address"),
  35. DB: viper.GetInt(item + ".database"),
  36. Password: viper.GetString(item + ".password"),
  37. DialTimeout: viper.GetDuration(item + ".dialTimeout"),
  38. PoolSize: viper.GetInt(item + ".poolSize"),
  39. })
  40. if err := rdsDb.Ping(ctx).Err(); err != nil {
  41. panic("连接redis失败")
  42. }
  43. return nil
  44. }
  45. // 关闭redis
  46. func CloseRds() error {
  47. if err := rdsDb.Close(); err != nil {
  48. return err
  49. }
  50. return nil
  51. }
  52. // 设置模型数据
  53. // key:保存的键值,全局唯一
  54. // dwExpire:过期时间,单位秒
  55. func (obj *RedisApi) SetModelData(key string, dataModel interface{}, wExpire uint16) error {
  56. val := reflect.ValueOf(dataModel)
  57. if val.Kind() != reflect.Ptr {
  58. return errors.New("参数检查错误,应为指针类型")
  59. }
  60. val = val.Elem()
  61. if val.Kind() != reflect.Struct {
  62. return errors.New("参数检查错误,应为结构体指针类型")
  63. }
  64. //模型转map
  65. dataList, _ := json.Marshal(dataModel)
  66. //保存数据
  67. duration := time.Duration(wExpire)
  68. if err := rdsDb.Set(ctx, key, dataList, duration*time.Minute).Err(); err != nil {
  69. return err
  70. }
  71. return nil
  72. }
  73. // 获得模型数据
  74. func (obj *RedisApi) GetModelData(key string, dataModel interface{}) error {
  75. val := reflect.ValueOf(dataModel)
  76. if val.Kind() != reflect.Ptr {
  77. return errors.New("参数检查错误,应为指针类型")
  78. }
  79. val = val.Elem()
  80. if val.Kind() != reflect.Struct {
  81. return errors.New("参数检查错误,应为结构体指针类型")
  82. }
  83. byteList, err := rdsDb.Get(ctx, key).Result()
  84. if err != nil {
  85. return errors.New(err.Error())
  86. }
  87. if err := json.Unmarshal([]byte(byteList), dataModel); err != nil {
  88. return errors.New(err.Error())
  89. }
  90. return nil
  91. }
  92. // 设置过期时间
  93. func (obj *RedisApi) SetExpireTime(key string, byExpire uint8) {
  94. duration := time.Duration(byExpire)
  95. rdsDb.Expire(ctx, key, duration*time.Minute)
  96. }