redisapi.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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. println(err.Error())
  42. panic("连接redis失败")
  43. }
  44. return nil
  45. }
  46. // 关闭redis
  47. func CloseRds() error {
  48. if err := rdsDb.Close(); err != nil {
  49. return err
  50. }
  51. return nil
  52. }
  53. // 设置模型数据
  54. // key:保存的键值,全局唯一
  55. // dwExpire:过期时间,单位秒
  56. func (obj *RedisApi) SetModelData(key string, dataModel interface{}, wExpire uint16) error {
  57. val := reflect.ValueOf(dataModel)
  58. if val.Kind() != reflect.Ptr {
  59. return errors.New("参数检查错误,应为指针类型")
  60. }
  61. val = val.Elem()
  62. if val.Kind() != reflect.Struct {
  63. return errors.New("参数检查错误,应为结构体指针类型")
  64. }
  65. //模型转map
  66. dataList, _ := json.Marshal(dataModel)
  67. //保存数据
  68. duration := time.Duration(wExpire)
  69. if err := rdsDb.Set(ctx, key, dataList, duration*time.Minute).Err(); err != nil {
  70. return err
  71. }
  72. return nil
  73. }
  74. // 获得模型数据
  75. func (obj *RedisApi) GetModelData(key string, dataModel interface{}) error {
  76. val := reflect.ValueOf(dataModel)
  77. if val.Kind() != reflect.Ptr {
  78. return errors.New("参数检查错误,应为指针类型")
  79. }
  80. val = val.Elem()
  81. if val.Kind() != reflect.Struct {
  82. return errors.New("参数检查错误,应为结构体指针类型")
  83. }
  84. byteList, err := rdsDb.Get(ctx, key).Result()
  85. if err != nil {
  86. return errors.New(err.Error())
  87. }
  88. if err := json.Unmarshal([]byte(byteList), dataModel); err != nil {
  89. return errors.New(err.Error())
  90. }
  91. return nil
  92. }
  93. // 设置过期时间
  94. func (obj *RedisApi) SetExpireTime(key string, byExpire uint8) {
  95. duration := time.Duration(byExpire)
  96. rdsDb.Expire(ctx, key, duration*time.Minute)
  97. }