package queueRedis import ( "context" "encoding/json" "github.com/redis/go-redis/v9" ) type Pool struct { Ctx context.Context Redis *redis.Client Name string } func New(redisDb *redis.Client, name string) *Pool { ctx := context.Background() return &Pool{ Ctx: ctx, Redis: redisDb, Name: name, } } func (k *Pool) LPush(value ...interface{}) error { var values []interface{} for _, v := range value { values = append(values, k.encode(v)) } return k.Redis.LPush(k.Ctx, k.Name, values...).Err() } func (k *Pool) RPush(value ...interface{}) error { var values []interface{} for _, v := range value { values = append(values, k.encode(v)) } return k.Redis.RPush(k.Ctx, k.Name, values...).Err() } func (k *Pool) Delete(value interface{}) error { return k.Redis.LRem(k.Ctx, k.Name, 0, k.encode(value)).Err() } // 取出值 func (k *Pool) GetByIndex(index int64, v interface{}) error { if d, err := k.Redis.LIndex(k.Ctx, k.Name, index).Result(); err != nil { return err } else { k.decode(d, v) return nil } } // 左-取出并删除 func (k *Pool) LPop(v interface{}) error { if d, err := k.Redis.LPop(k.Ctx, k.Name).Result(); err != nil { return err } else { k.decode(d, v) return nil } } // 右-取出并删除 func (k *Pool) RPop(v interface{}) error { if d, err := k.Redis.RPop(k.Ctx, k.Name).Result(); err != nil { return err } else { k.decode(d, v) return nil } } func (k *Pool) encode(value any) string { data, err := json.Marshal(value) if err != nil { return "{}" } return string(data) } func (k *Pool) decode(v string, value interface{}) { err := json.Unmarshal([]byte(v), value) _ = err } func (k *Pool) Length() (int64, error) { r := k.Redis.LLen(k.Ctx, k.Name) return r.Result() } func (k *Pool) Flush() error { return k.Redis.Del(k.Ctx, k.Name).Err() }