Documentation ¶
Overview ¶
Package cachestore is the caching (key->value) service abstraction layer
Index ¶
- Constants
- Variables
- func RandomHex(n int) (string, error)
- type CacheService
- type Client
- func (c *Client) Close(ctx context.Context)
- func (c *Client) Debug(on bool)
- func (c *Client) Delete(ctx context.Context, key string) error
- func (c *Client) EmptyCache(ctx context.Context) error
- func (c *Client) Engine() Engine
- func (c *Client) FreeCache() *freecache.Cache
- func (c *Client) Get(ctx context.Context, key string) (string, error)
- func (c *Client) GetModel(ctx context.Context, key string, model interface{}) error
- func (c *Client) IsDebug() bool
- func (c *Client) IsNewRelicEnabled() bool
- func (c *Client) Redis() *cache.Client
- func (c *Client) RedisConfig() *RedisConfig
- func (c *Client) ReleaseLock(ctx context.Context, lockKey, secret string) (bool, error)
- func (c *Client) Set(ctx context.Context, key string, value interface{}, dependencies ...string) error
- func (c *Client) SetModel(ctx context.Context, key string, model interface{}, ttl time.Duration, ...) error
- func (c *Client) WaitWriteLock(ctx context.Context, lockKey string, ttl, ttw int64) (string, error)
- func (c *Client) WriteLock(ctx context.Context, lockKey string, ttl int64) (string, error)
- func (c *Client) WriteLockWithSecret(ctx context.Context, lockKey, secret string, ttl int64) (string, error)
- type ClientInterface
- type ClientOps
- func WithDebugging() ClientOps
- func WithFreeCache() ClientOps
- func WithFreeCacheConnection(client *freecache.Cache) ClientOps
- func WithLogger(customLogger zLogger.GormLoggerInterface) ClientOps
- func WithNewRelic() ClientOps
- func WithRedis(redisConfig *RedisConfig) ClientOps
- func WithRedisConnection(redisClient *cache.Client) ClientOps
- type Engine
- type LockService
- type RedisConfig
Constants ¶
const ( // DefaultRedisMaxIdleTimeout is the default max timeout on an idle connection DefaultRedisMaxIdleTimeout = 240 * time.Second // DefaultRedisPort is the default Redis port DefaultRedisPort = "6379" // RedisPrefix is the prefix for URL based connections RedisPrefix = "redis://" )
const ( // DefaultCacheSize in bytes, where 1024 * 1024 represents a single Megabyte, and 100 * 1024*1024 represents 100 Megabytes. DefaultCacheSize = 100 * 1024 * 1024 // DefaultGCPercent is the percentage when full it will run GC DefaultGCPercent = 20 )
Variables ¶
var ErrAppNameRequired = errors.New("app name is required")
ErrAppNameRequired is when the app name is required
var ErrInvalidRedisConfig = errors.New("invalid redis config")
ErrInvalidRedisConfig is when the redis config is missing or invalid
var ErrKeyNotFound = errors.New("key not found")
ErrKeyNotFound is returned when a record is not found for a given key
var ErrKeyRequired = errors.New("key is empty and required")
ErrKeyRequired is returned when the key is empty (key->value)
var ErrLockCreateFailed = errors.New("failed creating cache lock")
ErrLockCreateFailed is the error when creating a lock fails
var ErrLockExists = errors.New("lock already exists with a different secret")
ErrLockExists is the error when trying to create a lock fails due to an existing lock
var ErrSecretGenerationFailed = errors.New("failed generating secret")
ErrSecretGenerationFailed is the error if the secret failed to generate
var ErrSecretRequired = errors.New("secret is empty and required")
ErrSecretRequired is returned when the secret is empty (value)
var ErrTTWCannotBeEmpty = errors.New("the TTW value cannot be empty")
ErrTTWCannotBeEmpty is when the TTW field is empty
Functions ¶
Types ¶
type CacheService ¶
type CacheService interface { Delete(ctx context.Context, key string) error Get(ctx context.Context, key string) (string, error) GetModel(ctx context.Context, key string, model interface{}) error Set(ctx context.Context, key string, value interface{}, dependencies ...string) error SetModel(ctx context.Context, key string, model interface{}, ttl time.Duration, dependencies ...string) error }
CacheService are the cache related methods
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client is the client (configuration)
func (*Client) EmptyCache ¶
EmptyCache will empty the cache entirely
CAUTION: this will dump all the stored cache
func (*Client) Get ¶
Get will return a value from a given key
Redis will be an interface{} but really a string (empty string)
func (*Client) GetModel ¶
GetModel will get a model (parsing JSON (bytes) -> Model)
Model needs to be a pointer to a struct
func (*Client) IsNewRelicEnabled ¶
IsNewRelicEnabled will return if new relic is enabled
func (*Client) Redis ¶
func (c *Client) Redis() *cache.Client
Redis will return the Redis client if found
func (*Client) RedisConfig ¶
func (c *Client) RedisConfig() *RedisConfig
RedisConfig will return the Redis config client if found
func (*Client) ReleaseLock ¶
ReleaseLock will release a given lock key only if the secret matches
func (*Client) Set ¶
func (c *Client) Set(ctx context.Context, key string, value interface{}, dependencies ...string) error
Set will set a key->value using the current engine
NOTE: redis only supports dependency keys at this time Value should be used as a string for best results
func (*Client) SetModel ¶
func (c *Client) SetModel(ctx context.Context, key string, model interface{}, ttl time.Duration, dependencies ...string) error
SetModel will set any model or struct (parsing Model->JSON (bytes))
Model needs to be a pointer to a struct NOTE: redis only supports dependency keys at this time
func (*Client) WaitWriteLock ¶
WaitWriteLock will aggressively try to make a lock until the TTW (in seconds) is reached
func (*Client) WriteLock ¶
WriteLock will create a unique lock/secret with a TTL (seconds) to expire The lockKey is unique and should be deterministic The secret will be automatically generated and stored in the locked key (returned)
func (*Client) WriteLockWithSecret ¶ added in v0.1.2
func (c *Client) WriteLockWithSecret(ctx context.Context, lockKey, secret string, ttl int64) (string, error)
WriteLockWithSecret will create a lock with the given secret with a TTL (seconds) to expire The lockKey is unique and should be deterministic The secret should be unique per instance/process that wants to acquire the lock
type ClientInterface ¶
type ClientInterface interface { CacheService LockService Close(ctx context.Context) Debug(on bool) EmptyCache(ctx context.Context) error Engine() Engine FreeCache() *freecache.Cache IsDebug() bool IsNewRelicEnabled() bool Redis() *cache.Client RedisConfig() *RedisConfig }
ClientInterface is the cachestore interface
type ClientOps ¶
type ClientOps func(c *clientOptions)
ClientOps allow functional options to be supplied that overwrite default client options.
func WithFreeCache ¶
func WithFreeCache() ClientOps
WithFreeCache will set the cache to local memory using FreeCache
func WithFreeCacheConnection ¶
WithFreeCacheConnection will set the cache to use an existing FreeCache connection
func WithLogger ¶
func WithLogger(customLogger zLogger.GormLoggerInterface) ClientOps
WithLogger will set the custom logger interface
func WithRedis ¶
func WithRedis(redisConfig *RedisConfig) ClientOps
WithRedis will set the redis configuration
func WithRedisConnection ¶
func WithRedisConnection(redisClient *cache.Client) ClientOps
WithRedisConnection will set an existing redis connection (read & write)
type Engine ¶
type Engine string
Engine is the different engines that are supported for the cachestore
const ( Empty Engine = "empty" // No engine set FreeCache Engine = "freecache" // FreeCache (in-memory cache) Redis Engine = "redis" // Redis )
Supported engines
type LockService ¶
type LockService interface { ReleaseLock(ctx context.Context, lockKey, secret string) (bool, error) WaitWriteLock(ctx context.Context, lockKey string, ttl, ttw int64) (string, error) WriteLock(ctx context.Context, lockKey string, ttl int64) (string, error) WriteLockWithSecret(ctx context.Context, lockKey, secret string, ttl int64) (string, error) }
LockService are the locking related methods
type RedisConfig ¶
type RedisConfig struct { DependencyMode bool `json:"dependency_mode" mapstructure:"dependency_mode"` // false for digital ocean (not supported) MaxActiveConnections int `json:"max_active_connections" mapstructure:"max_active_connections"` // 0 MaxConnectionLifetime time.Duration `json:"max_connection_lifetime" mapstructure:"max_connection_lifetime"` // 0 MaxIdleConnections int `json:"max_idle_connections" mapstructure:"max_idle_connections"` // 10 MaxIdleTimeout time.Duration `json:"max_idle_timeout" mapstructure:"max_idle_timeout"` // 240 * time.Second URL string `json:"url" mapstructure:"url"` // redis://localhost:6379 UseTLS bool `json:"use_tls" mapstructure:"use_tls"` // true for digital ocean (required) }
RedisConfig is the configuration for the cache client (redis)