97 lines
1.8 KiB
Go
97 lines
1.8 KiB
Go
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()
|
|
}
|