diff --git a/os/gsession/gsession_storage_redis.go b/os/gsession/gsession_storage_redis.go index 60f5c7096..9ce7322d5 100644 --- a/os/gsession/gsession_storage_redis.go +++ b/os/gsession/gsession_storage_redis.go @@ -22,7 +22,13 @@ type StorageRedis struct { updatingIdMap *gmap.StrIntMap // Updating TTL set for session id. } -// NewStorageFile creates and returns a file storage object for session. +var ( + // DefaultStorageRedisLoopInterval is the interval updating TTL for session ids + // in last duration. + DefaultStorageRedisLoopInterval = time.Minute +) + +// NewStorageRedis creates and returns a redis storage object for session. func NewStorageRedis(redis *gredis.Redis, prefix ...string) *StorageRedis { if redis == nil { return nil @@ -35,7 +41,7 @@ func NewStorageRedis(redis *gredis.Redis, prefix ...string) *StorageRedis { s.prefix = prefix[0] } // Batch updates the TTL for session ids timely. - gtimer.AddSingleton(DefaultStorageFileLoopInterval, func() { + gtimer.AddSingleton(DefaultStorageRedisLoopInterval, func() { var id string var ttlSeconds int for { diff --git a/os/gsession/gsession_storage_redis_hashtable.go b/os/gsession/gsession_storage_redis_hashtable.go index cf27131bf..552aae030 100644 --- a/os/gsession/gsession_storage_redis_hashtable.go +++ b/os/gsession/gsession_storage_redis_hashtable.go @@ -18,7 +18,7 @@ type StorageRedisHashTable struct { prefix string // Redis key prefix for session id. } -// NewStorageFile creates and returns a file storage object for session. +// NewStorageRedisHashTable creates and returns a redis hash table storage object for session. func NewStorageRedisHashTable(redis *gredis.Redis, prefix ...string) *StorageRedisHashTable { if redis == nil { return nil diff --git a/os/gsession/gsession_unit_storage_redis_hashtable_test.go b/os/gsession/gsession_unit_storage_redis_hashtable_test.go index ba5051bdc..77b04e221 100644 --- a/os/gsession/gsession_unit_storage_redis_hashtable_test.go +++ b/os/gsession/gsession_unit_storage_redis_hashtable_test.go @@ -20,6 +20,66 @@ func Test_StorageRedisHashTable(t *testing.T) { redis, err := gredis.NewFromStr("127.0.0.1:6379,0") gtest.Assert(err, nil) + storage := gsession.NewStorageRedisHashTable(redis) + manager := gsession.New(time.Second, storage) + sessionId := "" + gtest.Case(t, func() { + s := manager.New() + defer s.Close() + s.Set("k1", "v1") + s.Set("k2", "v2") + s.Sets(g.Map{ + "k3": "v3", + "k4": "v4", + }) + gtest.Assert(s.IsDirty(), true) + sessionId = s.Id() + }) + gtest.Case(t, func() { + s := manager.New(sessionId) + gtest.Assert(s.Get("k1"), "v1") + gtest.Assert(s.Get("k2"), "v2") + gtest.Assert(s.Get("k3"), "v3") + gtest.Assert(s.Get("k4"), "v4") + gtest.Assert(len(s.Map()), 4) + gtest.Assert(s.Map()["k1"], "v1") + gtest.Assert(s.Map()["k4"], "v4") + gtest.Assert(s.Id(), sessionId) + gtest.Assert(s.Size(), 4) + gtest.Assert(s.Contains("k1"), true) + gtest.Assert(s.Contains("k3"), true) + gtest.Assert(s.Contains("k5"), false) + s.Remove("k4") + gtest.Assert(s.Size(), 3) + gtest.Assert(s.Contains("k3"), true) + gtest.Assert(s.Contains("k4"), false) + s.RemoveAll() + gtest.Assert(s.Size(), 0) + gtest.Assert(s.Contains("k1"), false) + gtest.Assert(s.Contains("k2"), false) + s.Sets(g.Map{ + "k5": "v5", + "k6": "v6", + }) + gtest.Assert(s.Size(), 2) + gtest.Assert(s.Contains("k5"), true) + gtest.Assert(s.Contains("k6"), true) + s.Close() + }) + + time.Sleep(1500 * time.Millisecond) + gtest.Case(t, func() { + s := manager.New(sessionId) + gtest.Assert(s.Size(), 0) + gtest.Assert(s.Get("k5"), nil) + gtest.Assert(s.Get("k6"), nil) + }) +} + +func Test_StorageRedisHashTablePrefix(t *testing.T) { + redis, err := gredis.NewFromStr("127.0.0.1:6379,0") + gtest.Assert(err, nil) + prefix := "s_" storage := gsession.NewStorageRedisHashTable(redis, prefix) manager := gsession.New(time.Second, storage) diff --git a/os/gsession/gsession_unit_storage_redis_test.go b/os/gsession/gsession_unit_storage_redis_test.go index 809fc0272..75f48027a 100644 --- a/os/gsession/gsession_unit_storage_redis_test.go +++ b/os/gsession/gsession_unit_storage_redis_test.go @@ -20,6 +20,67 @@ func Test_StorageRedis(t *testing.T) { redis, err := gredis.NewFromStr("127.0.0.1:6379,0") gtest.Assert(err, nil) + storage := gsession.NewStorageRedis(redis) + manager := gsession.New(time.Second, storage) + sessionId := "" + gtest.Case(t, func() { + s := manager.New() + defer s.Close() + s.Set("k1", "v1") + s.Set("k2", "v2") + s.Sets(g.Map{ + "k3": "v3", + "k4": "v4", + }) + gtest.Assert(s.IsDirty(), true) + sessionId = s.Id() + }) + + time.Sleep(500 * time.Millisecond) + gtest.Case(t, func() { + s := manager.New(sessionId) + gtest.Assert(s.Get("k1"), "v1") + gtest.Assert(s.Get("k2"), "v2") + gtest.Assert(s.Get("k3"), "v3") + gtest.Assert(s.Get("k4"), "v4") + gtest.Assert(len(s.Map()), 4) + gtest.Assert(s.Map()["k1"], "v1") + gtest.Assert(s.Map()["k4"], "v4") + gtest.Assert(s.Id(), sessionId) + gtest.Assert(s.Size(), 4) + gtest.Assert(s.Contains("k1"), true) + gtest.Assert(s.Contains("k3"), true) + gtest.Assert(s.Contains("k5"), false) + s.Remove("k4") + gtest.Assert(s.Size(), 3) + gtest.Assert(s.Contains("k3"), true) + gtest.Assert(s.Contains("k4"), false) + s.RemoveAll() + gtest.Assert(s.Size(), 0) + gtest.Assert(s.Contains("k1"), false) + gtest.Assert(s.Contains("k2"), false) + s.Sets(g.Map{ + "k5": "v5", + "k6": "v6", + }) + gtest.Assert(s.Size(), 2) + gtest.Assert(s.Contains("k5"), true) + gtest.Assert(s.Contains("k6"), true) + }) + + time.Sleep(1000 * time.Millisecond) + gtest.Case(t, func() { + s := manager.New(sessionId) + gtest.Assert(s.Size(), 0) + gtest.Assert(s.Get("k5"), nil) + gtest.Assert(s.Get("k6"), nil) + }) +} + +func Test_StorageRedisPrefix(t *testing.T) { + redis, err := gredis.NewFromStr("127.0.0.1:6379,0") + gtest.Assert(err, nil) + prefix := "s_" storage := gsession.NewStorageRedis(redis, prefix) manager := gsession.New(time.Second, storage)