Skip to content

Commit 5a8f079

Browse files
authored
refactor(cache): Remove Remember method and related tests (#359)
1 parent b5a4f03 commit 5a8f079

File tree

5 files changed

+79
-48
lines changed

5 files changed

+79
-48
lines changed

cache/redis/store.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package redis
22

33
import (
44
"context"
5+
"errors"
56
"time"
67

78
"github.com/redis/go-redis/v9"
@@ -10,7 +11,7 @@ import (
1011
"github.com/go-kratos-ecosystem/components/v2/codec"
1112
"github.com/go-kratos-ecosystem/components/v2/codec/json"
1213
"github.com/go-kratos-ecosystem/components/v2/locker"
13-
redisLocker "github.com/go-kratos-ecosystem/components/v2/locker/redis"
14+
redislocker "github.com/go-kratos-ecosystem/components/v2/locker/redis"
1415
)
1516

1617
type Store struct {
@@ -72,6 +73,9 @@ func (s *Store) Has(ctx context.Context, key string) (bool, error) {
7273
func (s *Store) Get(ctx context.Context, key string, dest any) error {
7374
r := s.redis.Get(ctx, s.opts.prefix+key)
7475
if r.Err() != nil {
76+
if errors.Is(r.Err(), redis.Nil) {
77+
return cache.ErrNotFound
78+
}
7579
return r.Err()
7680
}
7781

@@ -161,8 +165,8 @@ func (s *Store) Add(ctx context.Context, key string, value any, ttl time.Duratio
161165
}
162166

163167
func (s *Store) Lock(key string, ttl time.Duration) locker.Locker {
164-
return redisLocker.NewLocker(s.redis,
165-
redisLocker.WithName(s.opts.prefix+key),
166-
redisLocker.WithTTL(ttl),
168+
return redislocker.NewLocker(s.redis,
169+
redislocker.WithName(s.opts.prefix+key),
170+
redislocker.WithTTL(ttl),
167171
)
168172
}

cache/redis/store_test.go

+46-15
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,25 @@ import (
1111
"github.com/redis/go-redis/v9"
1212
"github.com/stretchr/testify/assert"
1313

14+
"github.com/go-kratos-ecosystem/components/v2/cache"
1415
"github.com/go-kratos-ecosystem/components/v2/codec/json"
1516
"github.com/go-kratos-ecosystem/components/v2/locker"
1617
)
1718

18-
func createRedis() redis.UniversalClient {
19-
return redis.NewClient(&redis.Options{
19+
var ctx = context.Background()
20+
21+
func createRedis(t *testing.T) redis.UniversalClient {
22+
client := redis.NewClient(&redis.Options{
2023
Addr: ":6379",
2124
})
25+
t.Cleanup(func() {
26+
client.FlushAll(ctx)
27+
})
28+
return client
2229
}
2330

2431
func TestRedis_Base(t *testing.T) {
25-
store := New(createRedis(), Prefix("cache:redis"), Codec(json.Codec))
26-
ctx := context.Background()
32+
store := New(createRedis(t), Prefix("cache:redis"), Codec(json.Codec))
2733

2834
ok1, err := store.Put(ctx, "test", "test", time.Second)
2935
assert.Nil(t, err)
@@ -45,8 +51,7 @@ func TestRedis_Base(t *testing.T) {
4551
}
4652

4753
func TestRedis_IncrAndDecr(t *testing.T) {
48-
store := New(createRedis(), Prefix("cache:redis"))
49-
ctx := context.Background()
54+
store := New(createRedis(t), Prefix("cache:redis"))
5055

5156
_, err := store.Forget(ctx, "test:inc")
5257
assert.Nil(t, err)
@@ -62,12 +67,25 @@ func TestRedis_IncrAndDecr(t *testing.T) {
6267
v3, err := store.Decrement(ctx, "test:inc", 1)
6368
assert.Nil(t, err)
6469
assert.Equal(t, 10, v3)
70+
71+
// put another type
72+
ok1, err := store.Put(ctx, "test:inc:type", "test", time.Second*3)
73+
assert.Nil(t, err)
74+
assert.True(t, ok1)
75+
76+
v4, err := store.Increment(ctx, "test:inc:type", 1)
77+
t.Log(err)
78+
assert.Error(t, err)
79+
assert.Zero(t, v4)
80+
81+
v5, err := store.Decrement(ctx, "test:inc:type", 1)
82+
assert.Error(t, err)
83+
assert.Zero(t, v5)
6584
}
6685

6786
func TestRedis_Forever(t *testing.T) {
68-
client := createRedis()
69-
store := New(createRedis(), Prefix("cache:redis"))
70-
ctx := context.Background()
87+
client := createRedis(t)
88+
store := New(createRedis(t), Prefix("cache:redis"))
7189

7290
ok1, err := store.Forever(ctx, "test:forever", "test")
7391
assert.Nil(t, err)
@@ -80,8 +98,7 @@ func TestRedis_Forever(t *testing.T) {
8098
}
8199

82100
func TestRedis_Flush(t *testing.T) {
83-
store := New(createRedis(), Prefix("cache:redis"))
84-
ctx := context.Background()
101+
store := New(createRedis(t), Prefix("cache:redis"))
85102

86103
ok1, err := store.Put(ctx, "test:flush", "test", time.Second)
87104
assert.Nil(t, err)
@@ -92,13 +109,12 @@ func TestRedis_Flush(t *testing.T) {
92109
assert.True(t, ok2)
93110

94111
ok3, err := store.Has(ctx, "test:flush")
95-
assert.Nil(t, err)
112+
assert.NoError(t, err)
96113
assert.False(t, ok3)
97114
}
98115

99116
func TestRedis_Add(t *testing.T) {
100-
store := New(createRedis(), Prefix("cache:redis"))
101-
ctx := context.Background()
117+
store := New(createRedis(t), Prefix("cache:redis"))
102118

103119
ok1, err := store.Add(ctx, "test:add", "test", time.Second)
104120
assert.Nil(t, err)
@@ -115,7 +131,7 @@ func TestRedis_Add(t *testing.T) {
115131
}
116132

117133
func TestRedis_Lock(t *testing.T) {
118-
r := New(createRedis())
134+
r := New(createRedis(t))
119135
var wg sync.WaitGroup
120136
var s int64
121137

@@ -136,3 +152,18 @@ func TestRedis_Lock(t *testing.T) {
136152
wg.Wait()
137153
assert.True(t, s > 0)
138154
}
155+
156+
func TestRedis_ErrNotFound(t *testing.T) {
157+
store := New(createRedis(t), Prefix("cache:redis:notfound"))
158+
159+
// Has
160+
ok1, err := store.Has(ctx, "test:notfound:has")
161+
assert.Nil(t, err)
162+
assert.False(t, ok1)
163+
164+
// Get
165+
var v string
166+
err = store.Get(ctx, "test:notfound:get", &v)
167+
assert.True(t, errors.Is(err, cache.ErrNotFound))
168+
assert.Empty(t, v)
169+
}

cache/repository.go

-24
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package cache
33
import (
44
"context"
55
"time"
6-
7-
"github.com/go-kratos-ecosystem/components/v2/helpers"
86
)
97

108
type Repository interface {
@@ -14,7 +12,6 @@ type Repository interface {
1412
Missing(ctx context.Context, key string) (bool, error)
1513
Delete(ctx context.Context, key string) (bool, error)
1614
Set(ctx context.Context, key string, value any, ttl time.Duration) (bool, error)
17-
Remember(ctx context.Context, key string, dest any, value func() any, ttl time.Duration) error
1815
}
1916

2017
type repository struct {
@@ -63,24 +60,3 @@ func (r *repository) Delete(ctx context.Context, key string) (bool, error) {
6360
func (r *repository) Set(ctx context.Context, key string, value any, ttl time.Duration) (bool, error) {
6461
return r.Put(ctx, key, value, ttl)
6562
}
66-
67-
func (r *repository) Remember(
68-
ctx context.Context,
69-
key string, dest any,
70-
value func() any,
71-
ttl time.Duration,
72-
) error {
73-
if missing, err := r.Missing(ctx, key); err != nil {
74-
return err
75-
} else if missing {
76-
v := value()
77-
78-
if _, err := r.Set(ctx, key, v, ttl); err != nil {
79-
return err
80-
}
81-
82-
return helpers.Scan(v, dest)
83-
}
84-
85-
return r.Get(ctx, key, dest)
86-
}

cache/repository_test.go

-5
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,4 @@ func TestRepository(t *testing.T) {
7979
set, err := repo.Set(ctx, "test", "test", 0)
8080
assert.Nil(t, err)
8181
assert.True(t, set)
82-
83-
// Remember
84-
assert.Nil(t, repo.Remember(ctx, "test", nil, func() any {
85-
return "test"
86-
}, 0))
8782
}

cache/store.go

+25
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,43 @@ package cache
22

33
import (
44
"context"
5+
"errors"
56
"time"
67

78
"github.com/go-kratos-ecosystem/components/v2/locker"
89
)
910

11+
var (
12+
ErrNotFound = errors.New("cache: the key is not found")
13+
ErrNotInteger = errors.New("cache: the key is not an integer")
14+
)
15+
1016
type Store interface {
1117
Locker
1218

19+
// Has returns true if the key exists in the cache.
20+
// If the key does not exist, the return value will be false, and the return error will be nil.
21+
// If the key exists, the return value will be true, and the return error will be nil.
22+
// otherwise, the return error will be the store error.
1323
Has(ctx context.Context, key string) (bool, error)
1424

25+
// Get retrieves the value from the cache.
26+
// If the key does not exist, the dest will be unchanged, and the return error will be ErrNotFound.
27+
// If the key exists, the value will be unmarshaled to dest, and the return error will be nil.
28+
// otherwise, the return error will be the store error.
1529
Get(ctx context.Context, key string, dest any) error
1630

31+
// Put stores the value into the cache with an expiration time.
32+
// If put success, the return value will be true, and the return error will be nil.
33+
// otherwise, the return value will be false, and the return error will be the store error.
1734
Put(ctx context.Context, key string, value any, ttl time.Duration) (bool, error)
1835

36+
// Increment increments the value in the cache.
37+
// If the key does not exist, the before default value is 0.
1938
Increment(ctx context.Context, key string, value int) (int, error)
2039

40+
// Decrement decrements the value in the cache.
41+
// If the key does not exist, the before default value is 0.
2142
Decrement(ctx context.Context, key string, value int) (int, error)
2243

2344
Forever(ctx context.Context, key string, value any) (bool, error)
@@ -30,6 +51,10 @@ type Store interface {
3051
}
3152

3253
type Addable interface {
54+
// Add stores the value into the cache with an expiration time if the key does not exist.
55+
// If the key exists, the return value will be false, and the return error will be nil.
56+
// If the key does not exist, the return value will be true, and the return error will be nil.
57+
// otherwise, the return error will be the store error.
3358
Add(ctx context.Context, key string, value any, ttl time.Duration) (bool, error)
3459
}
3560

0 commit comments

Comments
 (0)