From 712fe441e0a4314d86d1b4cf7eadd60df2daf81b Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sat, 20 Apr 2024 22:20:44 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dttlcache=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E7=BC=BA=E5=A4=B1=E5=9B=9E=E6=94=B6=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/utils/expires/list.go | 8 ++++--- internal/utils/expires/list_test.go | 34 +++++++++++++++++------------ 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/internal/utils/expires/list.go b/internal/utils/expires/list.go index 79ca576..55377c1 100644 --- a/internal/utils/expires/list.go +++ b/internal/utils/expires/list.go @@ -55,17 +55,19 @@ func (this *List) Add(itemId uint64, expiresAt int64) { if oldExpiresAt == expiresAt { return } - delete(this.expireMap, oldExpiresAt) + delete(this.expireMap[oldExpiresAt], itemId) + if len(this.expireMap[oldExpiresAt]) == 0 { + delete(this.expireMap, oldExpiresAt) + } } expireItemMap, ok := this.expireMap[expiresAt] if ok { expireItemMap[itemId] = zero.New() } else { - expireItemMap = ItemMap{ + this.expireMap[expiresAt] = ItemMap{ itemId: zero.New(), } - this.expireMap[expiresAt] = expireItemMap } this.itemsMap[itemId] = expiresAt diff --git a/internal/utils/expires/list_test.go b/internal/utils/expires/list_test.go index 2d19496..d8b0e64 100644 --- a/internal/utils/expires/list_test.go +++ b/internal/utils/expires/list_test.go @@ -35,22 +35,28 @@ func TestList_Add_Overwrite(t *testing.T) { var list = expires.NewList() list.Add(1, timestamp+1) list.Add(1, timestamp+1) + list.Add(2, timestamp+1) list.Add(1, timestamp+2) logs.PrintAsJSON(list.ExpireMap(), t) logs.PrintAsJSON(list.ItemsMap(), t) var a = assert.NewAssertion(t) - a.IsTrue(len(list.ItemsMap()) == 1) - a.IsTrue(len(list.ExpireMap()) == 1) + a.IsTrue(len(list.ItemsMap()) == 2) + a.IsTrue(len(list.ExpireMap()) == 2) a.IsTrue(list.ItemsMap()[1] == timestamp+2) } func TestList_Remove(t *testing.T) { + var a = assert.NewAssertion(t) + var list = expires.NewList() list.Add(1, time.Now().Unix()+1) list.Remove(1) logs.PrintAsJSON(list.ExpireMap(), t) logs.PrintAsJSON(list.ItemsMap(), t) + + a.IsTrue(len(list.ExpireMap()) == 0) + a.IsTrue(len(list.ItemsMap()) == 0) } func TestList_GC(t *testing.T) { @@ -122,8 +128,8 @@ func TestList_ManyItems(t *testing.T) { list.Add(uint64(i), time.Now().Unix()+1) } - now := time.Now() - count := 0 + var now = time.Now() + var count = 0 list.OnGC(func(itemId uint64) { count++ }) @@ -156,12 +162,12 @@ func TestList_Map_Performance(t *testing.T) { var timestamp = time.Now().Unix() { - m := map[int64]int64{} + var m = map[int64]int64{} for i := 0; i < 1_000_000; i++ { m[int64(i)] = timestamp } - now := time.Now() + var now = time.Now() for i := 0; i < 100_000; i++ { delete(m, int64(i)) } @@ -169,12 +175,12 @@ func TestList_Map_Performance(t *testing.T) { } { - m := map[uint64]int64{} + var m = map[uint64]int64{} for i := 0; i < 1_000_000; i++ { m[uint64(i)] = timestamp } - now := time.Now() + var now = time.Now() for i := 0; i < 100_000; i++ { delete(m, uint64(i)) } @@ -182,12 +188,12 @@ func TestList_Map_Performance(t *testing.T) { } { - m := map[uint32]int64{} + var m = map[uint32]int64{} for i := 0; i < 1_000_000; i++ { m[uint32(i)] = timestamp } - now := time.Now() + var now = time.Now() for i := 0; i < 100_000; i++ { delete(m, uint32(i)) } @@ -211,7 +217,7 @@ func Benchmark_Map_Uint64(b *testing.B) { var i uint64 var count uint64 = 1_000_000 - m := map[uint64]uint64{} + var m = map[uint64]uint64{} for i = 0; i < count; i++ { m[i] = timestamp } @@ -231,15 +237,15 @@ func BenchmarkList_GC(b *testing.B) { for m := 0; m < 1_000; m++ { var list = expires.NewList() for j := 0; j < 10_000; j++ { - list.Add(uint64(j), fasttime.Now().Unix()+int64(rand.Int()%1_000_000)) + list.Add(uint64(j), fasttime.Now().Unix()+int64(rand.Int()%10_000_000)) } lists = append(lists, list) } - b.ResetTimer() - var timestamp = time.Now().Unix() + b.ResetTimer() + b.RunParallel(func(pb *testing.PB) { for pb.Next() { for _, list := range lists {