123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- package cache
- import (
- "context"
- "fmt"
- "log"
- "os"
- "strconv"
- "strings"
- "time"
- "github.com/go-redis/redis/v8"
- jsoniter "github.com/json-iterator/go"
- )
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- type Cache struct {
- client *redis.Client
- prefix string
- }
- type ChannelUserCache struct {
- ID int64
- Name string
- Permission []string `json:"permission"`
- IsTemp bool `json:"isTemp"`
- ValidArchivesIds []string `json:"validArchivesIds"`
- }
- type ManagerCache struct {
- ID int64
- }
- type MemberCache struct {
- ID int64
- Name string
- }
- var cache = &Cache{}
- func Instance() *Cache {
- return cache
- }
- func GetClient() *redis.Client {
- return cache.client
- }
- func InitRedis() *redis.Client {
- RedisDB, err := strconv.Atoi(os.Getenv("REDIS_DB"))
- if err != nil {
- log.Panic("Redis数据库错误", err)
- }
- // 初始化Cache
- return InitRedisClient(fmt.Sprintf("%s:%s", os.Getenv("REDIS_HOST"), os.Getenv("REDIS_PORT")), os.Getenv("REDIS_PASSWORD"), "lumen_cache:", RedisDB)
- }
- func InitRedisClient(addr, password, p string, db int) *redis.Client {
- client := redis.NewClient(&redis.Options{
- Addr: addr,
- Password: password,
- DB: db,
- })
- if err := client.Ping(context.Background()).Err(); err != nil {
- log.Panic("start cache", err)
- }
- cache.prefix = p
- cache.client = client
- return client
- }
- func (c *Cache) KeyWithPrefix(key string) string {
- return c.prefix + key
- }
- func (c *Cache) Get(key string) (string, error) {
- value, err := c.client.Get(context.Background(), c.KeyWithPrefix(key)).Result()
- if err != nil {
- return "", err
- }
- // PHP序列化之后的对象无法直接转为go的数据结构,直接都当数组处理
- value = strings.ReplaceAll(value, `O:8:"stdClass"`, `a`)
- value = strings.ReplaceAll(value, `O:17:"App\Models\Member"`, `a`)
- value = strings.ReplaceAll(value, `O:15:"App\Models\User"`, `a`)
- return value, nil
- }
- func (c *Cache) Put(key string, value interface{}, expiration time.Duration) error {
- valueStr, err := json.MarshalToString(value)
- if err != nil {
- return err
- }
- ok, err := c.client.SetEX(context.Background(), c.KeyWithPrefix(key), valueStr, expiration).Result()
- fmt.Println(ok, err)
- return err
- }
- func (c *Cache) PutStrForever(key string, value string) error {
- _, err := c.client.Set(context.Background(), c.KeyWithPrefix(key), value, 0).Result()
- return err
- }
- func (c *Cache) PutStr(key string, value string, expiration time.Duration) error {
- ok, err := c.client.SetEX(context.Background(), c.KeyWithPrefix(key), value, expiration).Result()
- fmt.Println(ok, err)
- return err
- }
- func (c *Cache) Delete(key string) (int64, error) {
- return c.client.Del(context.Background(), c.KeyWithPrefix(key)).Result()
- }
- func (c *Cache) Incr(key string) (int64, error) {
- return c.client.Incr(context.Background(), c.KeyWithPrefix(key)).Result()
- }
|