summaryrefslogtreecommitdiffstats
path: root/store.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--store.go27
1 files changed, 23 insertions, 4 deletions
diff --git a/store.go b/store.go
index f4ba952..8747cd2 100644
--- a/store.go
+++ b/store.go
@@ -10,6 +10,7 @@ import (
const initialBucketSize uint64 = 8
+ // node represents an entry in the cache with metadata for eviction and expiration.
type node struct {
Hash uint64
Expiration time.Time
@@ -22,10 +23,12 @@ type node struct {
EvictPrev *node
}
+ // IsValid checks if the node is still valid based on its expiration time.
func (n *node) IsValid() bool {
return n.Expiration.IsZero() || n.Expiration.After(time.Now())
}
+ // TTL returns the time-to-live of the node.
func (n *node) TTL() time.Duration {
if n.Expiration.IsZero() {
return 0
@@ -34,6 +37,7 @@ func (n *node) TTL() time.Duration {
}
}
+ // store represents the in-memory cache with eviction policies and periodic tasks.
type store struct {
Bucket []node
Length uint64
@@ -46,6 +50,7 @@ type store struct {
mu sync.Mutex
}
+ // Init initializes the store with default settings.
func (s *store) Init() {
s.Clear()
s.Policy.evict = &s.Evict
@@ -54,6 +59,7 @@ func (s *store) Init() {
s.Policy.SetPolicy(PolicyNone)
}
+ // Clear removes all entries from the store.
func (s *store) Clear() {
s.mu.Lock()
defer s.mu.Unlock()
@@ -66,11 +72,13 @@ func (s *store) Clear() {
s.Evict.EvictPrev = &s.Evict
}
+ // lookup calculates the hash and index for a given key.
func lookup(s *store, key []byte) (uint64, uint64) {
hash := hash(key)
return hash % uint64(len(s.Bucket)), hash
}
+ // lazyInitBucket initializes the hash bucket if it hasn't been initialized yet.
func lazyInitBucket(n *node) {
if n.HashNext == nil {
n.HashNext = n
@@ -78,6 +86,7 @@ func lazyInitBucket(n *node) {
}
}
+ // lookup finds a node in the store by key.
func (s *store) lookup(key []byte) (*node, uint64, uint64) {
idx, hash := lookup(s, key)
@@ -94,6 +103,7 @@ func (s *store) lookup(key []byte) (*node, uint64, uint64) {
return nil, idx, hash
}
+ // get retrieves a value from the store by key.
func (s *store) get(key []byte) ([]byte, time.Duration, bool) {
v, _, _ := s.lookup(key)
if v != nil {
@@ -108,6 +118,7 @@ func (s *store) get(key []byte) ([]byte, time.Duration, bool) {
return nil, 0, false
}
+ // Get retrieves a value from the store by key with locking.
func (s *store) Get(key []byte) ([]byte, time.Duration, bool) {
s.mu.Lock()
defer s.mu.Unlock()
@@ -115,14 +126,15 @@ func (s *store) Get(key []byte) ([]byte, time.Duration, bool) {
return s.get(key)
}
+ // resize doubles the size of the hash table and rehashes all entries.
func resize(s *store) {
bucket := make([]node, 2*len(s.Bucket))
for v := s.Evict.EvictNext; v != &s.Evict; v = v.EvictNext {
- if !v.IsValid() {
- deleteNode(s, v)
- continue
- }
+ // if !v.IsValid() {
+ // deleteNode(s, v)
+ // continue
+ // }
idx := v.Hash % uint64(len(bucket))
n := &bucket[idx]
@@ -137,6 +149,7 @@ func resize(s *store) {
s.Bucket = bucket
}
+ // cleanup removes expired entries from the store.
func cleanup(s *store) {
for v := s.Evict.EvictNext; v != &s.Evict; v = v.EvictNext {
if !v.IsValid() {
@@ -145,6 +158,7 @@ func cleanup(s *store) {
}
}
+ // evict removes entries from the store based on the eviction policy.
func evict(s *store) bool {
for s.MaxCost != 0 && s.MaxCost < s.Cost {
n := s.Policy.Evict()
@@ -156,6 +170,7 @@ func evict(s *store) bool {
return true
}
+ // set adds or updates a key-value pair in the store.
func (s *store) set(key []byte, value []byte, ttl time.Duration) {
v, idx, hash := s.lookup(key)
if v != nil {
@@ -195,6 +210,7 @@ func (s *store) set(key []byte, value []byte, ttl time.Duration) {
s.Length = s.Length + 1
}
+ // Set adds or updates a key-value pair in the store with locking.
func (s *store) Set(key []byte, value []byte, ttl time.Duration) {
s.mu.Lock()
defer s.mu.Unlock()
@@ -202,6 +218,7 @@ func (s *store) Set(key []byte, value []byte, ttl time.Duration) {
s.set(key, value, ttl)
}
+ // deleteNode removes a node from the store.
func deleteNode(s *store, v *node) {
v.HashNext.HashPrev = v.HashPrev
v.HashPrev.HashNext = v.HashNext
@@ -217,6 +234,7 @@ func deleteNode(s *store, v *node) {
s.Length = s.Length - 1
}
+ // delete removes a key-value pair from the store.
func (s *store) delete(key []byte) bool {
v, _, _ := s.lookup(key)
if v != nil {
@@ -227,6 +245,7 @@ func (s *store) delete(key []byte) bool {
return false
}
+ // Delete removes a key-value pair from the store with locking.
func (s *store) Delete(key []byte) bool {
s.mu.Lock()
defer s.mu.Unlock()