redis.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package redis
  2. import (
  3. "context"
  4. "encoding/json"
  5. "github.com/go-redis/redis/v8"
  6. "sync"
  7. "time"
  8. )
  9. var (
  10. internalClient *Client
  11. once sync.Once
  12. )
  13. // Init 初始化redis客户端
  14. func Init(ctx context.Context, addr, password string, db int) *Client {
  15. once.Do(func() {
  16. internalClient = newCli(ctx, addr, password, db)
  17. })
  18. return internalClient
  19. }
  20. // GetClient 获取redis客户端
  21. func GetClient() *Client {
  22. return internalClient
  23. }
  24. func GetRedisClient() *redis.Client {
  25. return internalClient.cli
  26. }
  27. // New 创建redis客户端实例
  28. func newCli(ctx context.Context, addr, password string, db int) *Client {
  29. cli := redis.NewClient(&redis.Options{
  30. Addr: addr,
  31. Password: password,
  32. DB: db,
  33. })
  34. cmd := cli.Ping(ctx)
  35. if err := cmd.Err(); err != nil {
  36. panic(err)
  37. }
  38. return &Client{
  39. cli,
  40. }
  41. }
  42. // Client redis客户端
  43. type Client struct {
  44. cli *redis.Client
  45. }
  46. // GetRedisClient 获取redis客户端
  47. func (a *Client) GetRedisClient() *redis.Client {
  48. return a.cli
  49. }
  50. // Set 设定值
  51. func (a *Client) Set(ctx context.Context, key string, value interface{}, expiration time.Duration) error {
  52. data, _ := json.Marshal(value)
  53. cmd := a.cli.Set(ctx, key, data, expiration)
  54. return cmd.Err()
  55. }
  56. // Get 获取值
  57. func (a *Client) Get(ctx context.Context, key string) (string, error) {
  58. cmd := a.cli.Get(ctx, key)
  59. if err := cmd.Err(); err != nil {
  60. if err == redis.Nil {
  61. return "", nil
  62. }
  63. }
  64. return cmd.Val(), nil
  65. }
  66. // GetForItem 获取缓存数据
  67. func (a *Client) GetForItem(ctx context.Context, key string, item interface{}) error {
  68. cmd, err := a.cli.Get(ctx, key).Bytes()
  69. if err != nil {
  70. if err == redis.Nil {
  71. return nil
  72. }
  73. }
  74. return json.Unmarshal(cmd, item)
  75. }
  76. // Exists 判断是否存在值
  77. func (a *Client) Exists(ctx context.Context, key string) (bool, error) {
  78. cmd := a.cli.Exists(ctx, key)
  79. val, err := cmd.Result()
  80. if err != nil {
  81. return false, err
  82. }
  83. return val > 0, nil
  84. }
  85. // Del 删除key
  86. func (a *Client) Del(ctx context.Context, key string) error {
  87. cmd := a.cli.Del(ctx, key)
  88. return cmd.Err()
  89. }
  90. // Incr 自增加值
  91. func (a *Client) Incr(ctx context.Context, key string) error {
  92. cmd := a.cli.Incr(ctx, key)
  93. return cmd.Err()
  94. }
  95. // Close 关闭连接
  96. func (a *Client) Close() {
  97. a.cli.Close()
  98. }