cache-redis/redis.go (153 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package redis
import (
"context"
"embed"
_ "embed"
"encoding/json"
"fmt"
"time"
"github.com/apache/answer-plugins/cache-redis/i18n"
"github.com/apache/answer-plugins/util"
"github.com/apache/answer/plugin"
"github.com/go-redis/redis/v8"
)
var (
configuredErr = fmt.Errorf("redis is not configured correctly")
//go:embed info.yaml
Info embed.FS
)
type Cache struct {
Config *CacheConfig
RedisClient *redis.Client
}
type CacheConfig struct {
Endpoint string `json:"endpoint"`
Username string `json:"username"`
Password string `json:"password"`
}
func init() {
plugin.Register(&Cache{
Config: &CacheConfig{},
})
}
func (c *Cache) Info() plugin.Info {
info := &util.Info{}
info.GetInfo(Info)
return plugin.Info{
Name: plugin.MakeTranslator(i18n.InfoName),
SlugName: info.SlugName,
Description: plugin.MakeTranslator(i18n.InfoDescription),
Author: info.Author,
Version: info.Version,
Link: info.Link,
}
}
func (c *Cache) GetString(ctx context.Context, key string) (data string, exist bool, err error) {
if c.RedisClient == nil {
return "", false, configuredErr
}
data, err = c.RedisClient.Get(ctx, key).Result()
if err == redis.Nil {
return "", false, nil
}
if err != nil {
return "", false, err
}
return data, true, nil
}
func (c *Cache) SetString(ctx context.Context, key, value string, ttl time.Duration) error {
if c.RedisClient == nil {
return configuredErr
}
return c.RedisClient.Set(ctx, key, value, ttl).Err()
}
func (c *Cache) GetInt64(ctx context.Context, key string) (data int64, exist bool, err error) {
if c.RedisClient == nil {
return 0, false, configuredErr
}
data, err = c.RedisClient.Get(ctx, key).Int64()
if err == redis.Nil {
return 0, false, nil
}
if err != nil {
return 0, false, err
}
return data, true, nil
}
func (c *Cache) SetInt64(ctx context.Context, key string, value int64, ttl time.Duration) error {
if c.RedisClient == nil {
return configuredErr
}
return c.RedisClient.Set(ctx, key, value, ttl).Err()
}
func (c *Cache) Increase(ctx context.Context, key string, value int64) (data int64, err error) {
if c.RedisClient == nil {
return 0, configuredErr
}
return c.RedisClient.IncrBy(ctx, key, value).Result()
}
func (c *Cache) Decrease(ctx context.Context, key string, value int64) (data int64, err error) {
if c.RedisClient == nil {
return 0, configuredErr
}
return c.RedisClient.DecrBy(ctx, key, value).Result()
}
func (c *Cache) Del(ctx context.Context, key string) error {
if c.RedisClient == nil {
return configuredErr
}
return c.RedisClient.Del(ctx, key).Err()
}
func (c *Cache) Flush(ctx context.Context) error {
if c.RedisClient == nil {
return configuredErr
}
return c.RedisClient.FlushDB(ctx).Err()
}
func (c *Cache) ConfigFields() []plugin.ConfigField {
return []plugin.ConfigField{
{
Name: "endpoint",
Type: plugin.ConfigTypeInput,
Title: plugin.MakeTranslator(i18n.ConfigEndpointTitle),
Description: plugin.MakeTranslator(i18n.ConfigEndpointDescription),
Required: true,
UIOptions: plugin.ConfigFieldUIOptions{
InputType: plugin.InputTypeText,
},
Value: c.Config.Endpoint,
},
{
Name: "username",
Type: plugin.ConfigTypeInput,
Title: plugin.MakeTranslator(i18n.ConfigUsernameTitle),
Description: plugin.MakeTranslator(i18n.ConfigUsernameDescription),
Required: false,
UIOptions: plugin.ConfigFieldUIOptions{
InputType: plugin.InputTypeText,
},
Value: c.Config.Username,
},
{
Name: "password",
Type: plugin.ConfigTypeInput,
Title: plugin.MakeTranslator(i18n.ConfigPasswordTitle),
Description: plugin.MakeTranslator(i18n.ConfigPasswordDescription),
Required: false,
UIOptions: plugin.ConfigFieldUIOptions{
InputType: plugin.InputTypePassword,
},
Value: c.Config.Password,
},
}
}
func (c *Cache) ConfigReceiver(config []byte) error {
conf := &CacheConfig{}
_ = json.Unmarshal(config, conf)
c.Config = conf
c.RedisClient = redis.NewClient(&redis.Options{
Addr: conf.Endpoint,
Username: conf.Username,
Password: conf.Password,
})
return nil
}