gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/store/memory/memory.go (about) 1 // Package memory is a in-memory store store 2 package memory 3 4 import ( 5 "sync" 6 "time" 7 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/config/options" 9 "gitee.com/liuxuezhan/go-micro-v1.18.0/store" 10 ) 11 12 type memoryStore struct { 13 options.Options 14 15 sync.RWMutex 16 values map[string]*memoryRecord 17 } 18 19 type memoryRecord struct { 20 r *store.Record 21 c time.Time 22 } 23 24 func (m *memoryStore) List() ([]*store.Record, error) { 25 m.RLock() 26 defer m.RUnlock() 27 28 //nolint:prealloc 29 var values []*store.Record 30 31 for _, v := range m.values { 32 // get expiry 33 d := v.r.Expiry 34 t := time.Since(v.c) 35 36 if d > time.Duration(0) { 37 // expired 38 if t > d { 39 continue 40 } 41 // update expiry 42 v.r.Expiry -= t 43 v.c = time.Now() 44 } 45 46 values = append(values, v.r) 47 } 48 49 return values, nil 50 } 51 52 func (m *memoryStore) Read(keys ...string) ([]*store.Record, error) { 53 m.RLock() 54 defer m.RUnlock() 55 56 //nolint:prealloc 57 var records []*store.Record 58 59 for _, key := range keys { 60 v, ok := m.values[key] 61 if !ok { 62 return nil, store.ErrNotFound 63 } 64 65 // get expiry 66 d := v.r.Expiry 67 t := time.Since(v.c) 68 69 // expired 70 if d > time.Duration(0) { 71 if t > d { 72 return nil, store.ErrNotFound 73 } 74 // update expiry 75 v.r.Expiry -= t 76 v.c = time.Now() 77 } 78 79 records = append(records, v.r) 80 } 81 82 return records, nil 83 } 84 85 func (m *memoryStore) Write(records ...*store.Record) error { 86 m.Lock() 87 defer m.Unlock() 88 89 for _, r := range records { 90 // set the record 91 m.values[r.Key] = &memoryRecord{ 92 r: r, 93 c: time.Now(), 94 } 95 } 96 97 return nil 98 } 99 100 func (m *memoryStore) Delete(keys ...string) error { 101 m.Lock() 102 defer m.Unlock() 103 104 for _, key := range keys { 105 // delete the value 106 delete(m.values, key) 107 } 108 109 return nil 110 } 111 112 // NewStore returns a new store.Store 113 func NewStore(opts ...options.Option) store.Store { 114 options := options.NewOptions(opts...) 115 116 return &memoryStore{ 117 Options: options, 118 values: make(map[string]*memoryRecord), 119 } 120 }