You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.8 KiB
Go

package cache
import (
"errors"
"fmt"
"git.noahlan.cn/n-admin/n-admin-server/dal"
"git.noahlan.cn/noahlan/ntool/nlog"
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/redis"
"time"
)
type (
CodeCache interface {
// GetCachedCode 获取缓存的Code和ttl
// subject: 主体
// source: 来源
// typ: 类型
GetCachedCode(subject, source, typ string) (string, int, error)
// CacheCode 缓存Code
CacheCode(code, subject, source, typ string, expiresIn int) error
// DelCode 移除subject与用途对应的code
DelCode(subject, source, typ string) error
}
codeCacheMgr struct {
cache cache.Cache
redis *redis.Redis
}
)
func NewCodeCacheMgr(cache cache.Cache, rds *redis.Redis) CodeCache {
return &codeCacheMgr{cache: cache, redis: rds}
}
func (m *codeCacheMgr) GetCachedCode(subject, source, typ string) (string, int, error) {
var code string
key := fmt.Sprintf("%s_CODE:%s:%s", source, typ, subject)
err := m.cache.Get(key, &code)
if err != nil && !errors.Is(err, dal.ErrCacheNotFound) {
nlog.Errorw("[CodeCache] get code err", nlog.Field("err", err.Error()))
return "", 0, err
}
ttl, _ := m.redis.Ttl(key)
return code, ttl, nil
}
func (m *codeCacheMgr) CacheCode(code, subject, usage, typ string, expiresIn int) error {
key := fmt.Sprintf("%s_CODE:%s:%s", usage, typ, subject)
err := m.cache.SetWithExpire(key, code, time.Second*time.Duration(expiresIn))
if err != nil {
nlog.Errorw("[CodeCache] caching err", nlog.Field("err", err.Error()))
return err
}
return nil
}
func (m *codeCacheMgr) DelCode(subject, usage, typ string) error {
key := fmt.Sprintf("%s_CODE:%s:%s", usage, typ, subject)
err := m.cache.Del(key)
if err != nil {
nlog.Errorw("[CodeCache] delete key err", nlog.Field("err", err.Error()))
return err
}
return nil
}