优化结构
This commit is contained in:
Vendored
+13
-3
@@ -31,7 +31,12 @@ func New(provider RedisProvider) system.Cache {
|
||||
return &Store{provider: provider, memory: make(map[string]memoryEntry)}
|
||||
}
|
||||
|
||||
func (s *Store) client() redis.UniversalClient { return s.provider.RedisClient() }
|
||||
func (s *Store) client() redis.UniversalClient {
|
||||
if s == nil || s.provider == nil {
|
||||
return nil
|
||||
}
|
||||
return s.provider.RedisClient()
|
||||
}
|
||||
|
||||
func (s *Store) Get(ctx context.Context, key string) (string, bool, error) {
|
||||
if client := s.client(); client != nil {
|
||||
@@ -101,6 +106,7 @@ func (s *Store) Increment(ctx context.Context, key string, expiration time.Durat
|
||||
entry, ok := s.memory[key]
|
||||
if ok && !entry.expiresAt.IsZero() && time.Now().After(entry.expiresAt) {
|
||||
ok = false
|
||||
entry = memoryEntry{}
|
||||
}
|
||||
value := int64(0)
|
||||
if ok {
|
||||
@@ -108,8 +114,12 @@ func (s *Store) Increment(ctx context.Context, key string, expiration time.Durat
|
||||
}
|
||||
value++
|
||||
entry.value = strconv.FormatInt(value, 10)
|
||||
if !ok && expiration > 0 {
|
||||
entry.expiresAt = time.Now().Add(expiration)
|
||||
if !ok {
|
||||
if expiration > 0 {
|
||||
entry.expiresAt = time.Now().Add(expiration)
|
||||
} else {
|
||||
entry.expiresAt = time.Time{}
|
||||
}
|
||||
}
|
||||
s.memory[key] = entry
|
||||
return value, nil
|
||||
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
package cache
|
||||
|
||||
import (
|
||||
"context"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestStoreWithoutRedisProviderUsesMemoryFallback(t *testing.T) {
|
||||
store := New(nil)
|
||||
ctx := context.Background()
|
||||
|
||||
if err := store.Set(ctx, "key", "value", time.Minute); err != nil {
|
||||
t.Fatalf("Set() error = %v", err)
|
||||
}
|
||||
if value, ok, err := store.Get(ctx, "key"); err != nil || !ok || value != "value" {
|
||||
t.Fatalf("Get() = %q, %v, %v", value, ok, err)
|
||||
}
|
||||
if value, err := store.Increment(ctx, "counter", time.Minute); err != nil || value != 1 {
|
||||
t.Fatalf("Increment() = %d, %v", value, err)
|
||||
}
|
||||
if err := store.Delete(ctx, "key"); err != nil {
|
||||
t.Fatalf("Delete() error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestStoreIncrementRecreatesExpiredKeyWithoutStaleExpiry(t *testing.T) {
|
||||
store := New(nil)
|
||||
ctx := context.Background()
|
||||
|
||||
if _, err := store.Increment(ctx, "counter", time.Millisecond); err != nil {
|
||||
t.Fatalf("initial Increment() error = %v", err)
|
||||
}
|
||||
time.Sleep(5 * time.Millisecond)
|
||||
if value, err := store.Increment(ctx, "counter", 0); err != nil || value != 1 {
|
||||
t.Fatalf("expired Increment() = %d, %v", value, err)
|
||||
}
|
||||
time.Sleep(5 * time.Millisecond)
|
||||
if value, ok, err := store.Get(ctx, "counter"); err != nil || !ok || value != "1" {
|
||||
t.Fatalf("Get() after recreation = %q, %v, %v", value, ok, err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user