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
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
|
|
}
|