2024-09-05 08:48:59 +02:00
|
|
|
package cache
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"github.com/redis/rueidis"
|
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
redisOpts struct {
|
|
|
|
DSN string
|
|
|
|
}
|
|
|
|
|
|
|
|
redisCache struct {
|
|
|
|
client rueidis.Client
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
func NewRedisCache(o redisOpts) (Cache, error) {
|
|
|
|
client, err := rueidis.NewClient(rueidis.ClientOption{
|
|
|
|
InitAddress: []string{o.DSN},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return &redisCache{
|
|
|
|
client: client,
|
|
|
|
}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *redisCache) Add(ctx context.Context, key string) error {
|
|
|
|
// Without NX it will overwrite any existing KEY
|
|
|
|
cmd := c.client.B().Set().Key(key).Value("true").Build()
|
|
|
|
return c.client.Do(ctx, cmd).Error()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *redisCache) Remove(ctx context.Context, key string) error {
|
|
|
|
cmd := c.client.B().Del().Key(key).Build()
|
|
|
|
return c.client.Do(ctx, cmd).Error()
|
|
|
|
}
|
|
|
|
|
2024-11-20 07:53:54 +01:00
|
|
|
func (c *redisCache) Exists(ctx context.Context, key string) (bool, error) {
|
|
|
|
cmd := c.client.B().Exists().Key(key).Build()
|
|
|
|
res, err := c.client.Do(ctx, cmd).AsBool()
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *redisCache) ExistsNetwork(ctx context.Context, token string, addresses ...string) (bool, error) {
|
|
|
|
tokenCmd := c.client.B().Exists().Key(token).Build()
|
|
|
|
tokenRes, err := c.client.Do(ctx, tokenCmd).AsBool()
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
} else if !tokenRes {
|
|
|
|
return false, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
cmd := c.client.B().Exists().Key(addresses...).Build()
|
2024-09-05 08:48:59 +02:00
|
|
|
res, err := c.client.Do(ctx, cmd).AsBool()
|
|
|
|
if err != nil {
|
|
|
|
return false, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (c *redisCache) Size(ctx context.Context) (int64, error) {
|
|
|
|
cmd := c.client.B().Dbsize().Build()
|
|
|
|
return c.client.Do(ctx, cmd).AsInt64()
|
|
|
|
}
|