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  }