Fix: failed unit test / Feat: support TTL in redis cache

This commit is contained in:
HFO4
2019-12-13 13:22:10 +08:00
parent 8703f97e20
commit afc0b647ca
14 changed files with 78 additions and 369 deletions

8
pkg/cache/driver.go vendored
View File

@@ -12,7 +12,7 @@ var Store Driver = NewMemoStore()
func Init() {
//Store = NewRedisStore(10, "tcp", "127.0.0.1:6379", "", "0")
//return
if conf.RedisConfig.Server != "" && gin.Mode() == gin.TestMode {
if conf.RedisConfig.Server != "" && gin.Mode() != gin.TestMode {
Store = NewRedisStore(
10,
"tcp",
@@ -26,7 +26,7 @@ func Init() {
// Driver 键值缓存存储容器
type Driver interface {
// 设置值
Set(key string, value interface{}) error
Set(key string, value interface{}, ttl int) error
// 取值
Get(key string) (interface{}, bool)
// 批量取值返回成功取值的map即不存在的值
@@ -38,8 +38,8 @@ type Driver interface {
}
// Set 设置缓存值
func Set(key string, value interface{}) error {
return Store.Set(key, value)
func Set(key string, value interface{}, ttl int) error {
return Store.Set(key, value, ttl)
}
// Get 获取缓存值

View File

@@ -8,12 +8,12 @@ import (
func TestSet(t *testing.T) {
asserts := assert.New(t)
asserts.NoError(Set("123", "321"))
asserts.NoError(Set("123", "321", -1))
}
func TestGet(t *testing.T) {
asserts := assert.New(t)
asserts.NoError(Set("123", "321"))
asserts.NoError(Set("123", "321", -1))
value, ok := Get("123")
asserts.True(ok)
@@ -25,7 +25,7 @@ func TestGet(t *testing.T) {
func TestGetSettings(t *testing.T) {
asserts := assert.New(t)
asserts.NoError(Set("test_1", "1"))
asserts.NoError(Set("test_1", "1", -1))
values, missed := GetSettings([]string{"1", "2"}, "test_")
asserts.Equal(map[string]string{"1": "1"}, values)

2
pkg/cache/memo.go vendored
View File

@@ -15,7 +15,7 @@ func NewMemoStore() *MemoStore {
}
// Set 存储值
func (store *MemoStore) Set(key string, value interface{}) error {
func (store *MemoStore) Set(key string, value interface{}, ttl int) error {
store.Store.Store(key, value)
return nil
}

View File

@@ -17,7 +17,7 @@ func TestMemoStore_Set(t *testing.T) {
asserts := assert.New(t)
store := NewMemoStore()
err := store.Set("KEY", "vAL")
err := store.Set("KEY", "vAL", -1)
asserts.NoError(err)
val, ok := store.Store.Load("KEY")
@@ -31,7 +31,7 @@ func TestMemoStore_Get(t *testing.T) {
// 正常情况
{
_ = store.Set("string", "string_val")
_ = store.Set("string", "string_val", -1)
val, ok := store.Get("string")
asserts.Equal("string_val", val)
asserts.True(ok)
@@ -50,7 +50,7 @@ func TestMemoStore_Get(t *testing.T) {
key int
}
test := testStruct{key: 233}
_ = store.Set("struct", test)
_ = store.Set("struct", test, -1)
val, ok := store.Get("struct")
asserts.True(ok)
res, ok := val.(testStruct)
@@ -64,10 +64,10 @@ func TestMemoStore_Gets(t *testing.T) {
asserts := assert.New(t)
store := NewMemoStore()
err := store.Set("1", "1,val")
err = store.Set("2", "2,val")
err = store.Set("3", "3,val")
err = store.Set("4", "4,val")
err := store.Set("1", "1,val", -1)
err = store.Set("2", "2,val", -1)
err = store.Set("3", "3,val", -1)
err = store.Set("4", "4,val", -1)
asserts.NoError(err)
// 全部命中

9
pkg/cache/redis.go vendored
View File

@@ -75,7 +75,7 @@ func NewRedisStore(size int, network, address, password, database string) *Redis
}
// Set 存储值
func (store *RedisStore) Set(key string, value interface{}) error {
func (store *RedisStore) Set(key string, value interface{}, ttl int) error {
rc := store.pool.Get()
defer rc.Close()
@@ -88,7 +88,12 @@ func (store *RedisStore) Set(key string, value interface{}) error {
return rc.Err()
}
_, err = rc.Do("SET", key, serialized)
if ttl > 0 {
_, err = rc.Do("SETEX", key, ttl, serialized)
} else {
_, err = rc.Do("SET", key, serialized)
}
if err != nil {
return err
}

View File

@@ -42,7 +42,19 @@ func TestRedisStore_Set(t *testing.T) {
// 正常情况
{
cmd := conn.Command("SET", "test", redigomock.NewAnyData()).ExpectStringSlice("OK")
err := store.Set("test", "test val")
err := store.Set("test", "test val", -1)
asserts.NoError(err)
if conn.Stats(cmd) != 1 {
fmt.Println("Command was not used")
return
}
}
// 带有TTL
// 正常情况
{
cmd := conn.Command("SETEX", "test", 10, redigomock.NewAnyData()).ExpectStringSlice("OK")
err := store.Set("test", "test val", 10)
asserts.NoError(err)
if conn.Stats(cmd) != 1 {
fmt.Println("Command was not used")
@@ -57,7 +69,7 @@ func TestRedisStore_Set(t *testing.T) {
}{
Key: "123",
}
err := store.Set("test", value)
err := store.Set("test", value, -1)
asserts.Error(err)
}
@@ -65,7 +77,7 @@ func TestRedisStore_Set(t *testing.T) {
{
conn.Clear()
cmd := conn.Command("SET", "test", redigomock.NewAnyData()).ExpectError(errors.New("error"))
err := store.Set("test", "test val")
err := store.Set("test", "test val", -1)
asserts.Error(err)
if conn.Stats(cmd) != 1 {
fmt.Println("Command was not used")
@@ -78,7 +90,7 @@ func TestRedisStore_Set(t *testing.T) {
Dial: func() (redis.Conn, error) { return nil, errors.New("error") },
MaxIdle: 10,
}
err := store.Set("test", "123")
err := store.Set("test", "123", -1)
asserts.Error(err)
}