mirror of
https://github.com/mattermost/mattermost.git
synced 2026-02-03 20:40:00 -05:00
While using Redis, there is no need to invalidate and then update the new count from the DB when we know the exact number it is going to be incremented or decremented by. In that case, we can directly use Redis primitives to update the cache and prevent yet another DB query. To achieve this, we modify the LRU cache get/set paths slightly to not marshal into byte slices for *int64 values. This is needed for Redis to operate the INCR/DECR commands. https://mattermost.atlassian.net/browse/MM-59933 ```release-note NONE ``` Co-authored-by: Mattermost Build <build@mattermost.com>
68 lines
2.4 KiB
Go
68 lines
2.4 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package cache
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
)
|
|
|
|
// ErrKeyNotFound is the error when the given key is not found
|
|
var ErrKeyNotFound = errors.New("key not found")
|
|
|
|
// Cache is a representation of a cache store that aims to replace cache.Cache
|
|
type Cache interface {
|
|
// Purge is used to completely clear the cache.
|
|
Purge() error
|
|
|
|
// SetWithDefaultExpiry adds the given key and value to the store with the default expiry. If
|
|
// the key already exists, it will overwrite the previous value
|
|
SetWithDefaultExpiry(key string, value any) error
|
|
|
|
// SetWithExpiry adds the given key and value to the cache with the given expiry. If the key
|
|
// already exists, it will overwrite the previous value
|
|
SetWithExpiry(key string, value any, ttl time.Duration) error
|
|
|
|
// Get the content stored in the cache for the given key, and decode it into the value interface.
|
|
// Returns ErrKeyNotFound if the key is missing from the cache
|
|
Get(key string, value any) error
|
|
|
|
// GetMulti returns values for multiple keys in a single operation.
|
|
// Returns ErrKeyNotFound if the key is missing from the cache.
|
|
GetMulti(keys []string, values []any) []error
|
|
|
|
// Remove deletes the value for a given key.
|
|
Remove(key string) error
|
|
|
|
// RemoveMulti deletes multiple keys in a single operation.
|
|
RemoveMulti(keys []string) error
|
|
|
|
// Scan allows incremental iteration over the entire key-space
|
|
// in a performant manner. It provides a callback that consumers
|
|
// can use to process the keys. If the callback returns an error,
|
|
// the scan stops, returning the same error.
|
|
Scan(f func([]string) error) error
|
|
|
|
// GetInvalidateClusterEvent returns the cluster event configured when this cache was created.
|
|
GetInvalidateClusterEvent() model.ClusterEvent
|
|
|
|
// Name returns the name of the cache
|
|
Name() string
|
|
}
|
|
|
|
// ExternalCache is a super-set of the Cache interface with
|
|
// a couple of more methods that allows for more efficient cache updates.
|
|
// This can be achieved because the cache is external and an update
|
|
// is visible to all nodes.
|
|
type ExternalCache interface {
|
|
Cache
|
|
// Increment will increment the
|
|
// number stored at that key by the value.
|
|
Increment(key string, val int) error
|
|
// Decrement will decrement the
|
|
// number stored at that key by the value.
|
|
Decrement(key string, val int) error
|
|
}
|