import (
"sync"
"sync/atomic"
+ "time"
)
type Map struct {
}
return t
}
+
+type MapExceeded[K, V any] struct {
+ m Map
+}
+
+type mapExceededItem[V any] struct {
+ data *V
+ exceeded time.Time
+}
+
+func (t *MapExceeded[K, V]) Store(k K, v V, dur time.Duration) {
+ t.m.Store(k, mapExceededItem[V]{
+ data: &v,
+ exceeded: time.Now().Add(dur),
+ })
+}
+
+func (t *MapExceeded[K, V]) Load(k K) (*V, bool) {
+ if v, ok := t.m.Load(k); ok {
+ if v.(mapExceededItem[V]).exceeded.After(time.Now()) {
+ return v.(mapExceededItem[V]).data, true
+ }
+ t.Delete(k)
+ }
+ return nil, false
+}
+
+func (t *MapExceeded[K, V]) Range(f func(key K, value *V) bool) {
+ t.m.Range(func(key, value any) bool {
+ if value.(mapExceededItem[V]).exceeded.After(time.Now()) {
+ return f(key.(K), value.(*V))
+ }
+ t.Delete(key.(K))
+ return true
+ })
+}
+
+func (t *MapExceeded[K, V]) GC(dur ...time.Duration) {
+ t.m.Range(func(key, value any) bool {
+ if value.(mapExceededItem[V]).exceeded.Before(time.Now()) {
+ t.Delete(key.(K))
+ }
+ return true
+ })
+}
+
+func (t *MapExceeded[K, V]) Delete(k K) {
+ t.m.Delete(k)
+}
package part
import (
+ "bytes"
"sync"
"testing"
+ "time"
)
type tmp struct {
return true
})
}
+
+func TestMapExceeded1(t *testing.T) {
+ var m MapExceeded[string, []byte]
+ m.Store("1", []byte("1"), time.Second)
+ if b, ok := m.Load("1"); !ok || 0 != bytes.Compare(*b, []byte("1")) {
+ t.Fatal(ok, b)
+ }
+ time.Sleep(time.Second * 2)
+ if b, ok := m.Load("1"); ok || b != nil {
+ t.Fatal()
+ }
+}
"sync"
"time"
+ psync "github.com/qydysky/part/sync"
sys "github.com/qydysky/part/sys"
)
return
}
+type Cache struct {
+ g psync.MapExceeded[string, []byte]
+}
+
+func (t *Cache) IsCache(key string) (res *[]byte, isCache bool) {
+ return t.g.Load(key)
+}
+
+func (t *Cache) Store(key string, aliveDur time.Duration, data []byte) {
+ t.g.Store(key, data, aliveDur)
+}
+
func Easy_boot() *Web {
s := New(&http.Server{
Addr: "127.0.0.1:" + strconv.Itoa(sys.Sys().GetFreePort()),