redis.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package redis
  2. import (
  3. "context"
  4. "github.com/pkg/errors"
  5. "github.com/redis/go-redis/v9"
  6. "strings"
  7. "time"
  8. )
  9. const (
  10. keyPrefix = "baize::cache::"
  11. )
  12. type Cache struct {
  13. namespace string
  14. redisClient *redis.Client
  15. }
  16. func New(address string, userName string, password string, db int, namespace string) (*Cache, error) {
  17. if address == "" {
  18. return nil, errors.New("redis address不能为空")
  19. }
  20. return &Cache{
  21. namespace: namespace,
  22. redisClient: redis.NewClient(&redis.Options{
  23. Addr: address,
  24. Username: userName,
  25. Password: password,
  26. DB: db,
  27. })}, nil
  28. }
  29. func Destroy(cache *Cache) error {
  30. if cache == nil || cache.redisClient == nil {
  31. return nil
  32. }
  33. err := cache.redisClient.Close()
  34. if err != nil {
  35. return errors.New(err.Error())
  36. }
  37. cache.redisClient = nil
  38. return nil
  39. }
  40. func (cache *Cache) Set(key string, value string, expireSec int64) error {
  41. cmd := cache.redisClient.Set(context.Background(), cache.key2CacheKey(key), value, time.Duration(expireSec)*time.Second)
  42. if cmd.Err() != nil {
  43. return errors.New(cmd.Err().Error())
  44. }
  45. return nil
  46. }
  47. func (cache *Cache) Get(key string) (string, error) {
  48. cmd := cache.redisClient.Get(context.Background(), cache.key2CacheKey(key))
  49. if cmd.Err() != nil {
  50. if cmd.Err().Error() == redis.Nil.Error() {
  51. return "", nil
  52. }
  53. return "", errors.New(cmd.Err().Error())
  54. }
  55. return cmd.Val(), nil
  56. }
  57. func (cache *Cache) GetMulti(keys []string) (map[string]string, error) {
  58. result := make(map[string]string)
  59. for _, key := range keys {
  60. cmd := cache.redisClient.Get(context.Background(), cache.key2CacheKey(key))
  61. if cmd.Err() != nil {
  62. if cmd.Err().Error() == redis.Nil.Error() {
  63. result[key] = ""
  64. continue
  65. }
  66. return nil, cmd.Err()
  67. }
  68. result[key] = cmd.Val()
  69. }
  70. return result, nil
  71. }
  72. func (cache *Cache) GetAll() (map[string]string, error) {
  73. result := make(map[string]string)
  74. keysCmd := cache.redisClient.Keys(context.Background(), keyPrefix+cache.namespace+"::*")
  75. if keysCmd.Err() != nil {
  76. return nil, errors.New(keysCmd.Err().Error())
  77. }
  78. for _, cacheKey := range keysCmd.Val() {
  79. cmd := cache.redisClient.Get(context.Background(), cacheKey)
  80. if cmd.Err() != nil {
  81. if cmd.Err().Error() == redis.Nil.Error() {
  82. result[cache.cacheKey2Key(cacheKey)] = ""
  83. continue
  84. }
  85. return nil, cmd.Err()
  86. }
  87. result[cache.cacheKey2Key(cacheKey)] = cmd.Val()
  88. }
  89. return result, nil
  90. }
  91. func (cache *Cache) Delete(key string) error {
  92. cmd := cache.redisClient.Del(context.Background(), cache.key2CacheKey(key))
  93. if cmd.Err() != nil {
  94. return errors.New(cmd.Err().Error())
  95. }
  96. return nil
  97. }
  98. func (cache *Cache) Clear() error {
  99. keysCmd := cache.redisClient.Keys(context.Background(), keyPrefix+cache.namespace+"::*")
  100. if keysCmd.Err() != nil {
  101. return errors.New(keysCmd.Err().Error())
  102. }
  103. if keysCmd.Val() == nil || len(keysCmd.Val()) == 0 {
  104. return nil
  105. }
  106. delCmd := cache.redisClient.Del(context.Background(), keysCmd.Val()...)
  107. if delCmd.Err() != nil {
  108. return errors.New(delCmd.Err().Error())
  109. }
  110. return nil
  111. }
  112. func (cache *Cache) key2CacheKey(key string) string {
  113. return keyPrefix + cache.namespace + "::" + key
  114. }
  115. func (cache *Cache) cacheKey2Key(cacheKey string) string {
  116. return strings.TrimPrefix(cacheKey, keyPrefix+cache.namespace+"::")
  117. }