diff options
author | Marc Pervaz Boocha <marcpervaz@qburst.com> | 2025-02-19 18:28:03 +0530 |
---|---|---|
committer | Marc Pervaz Boocha <marcpervaz@qburst.com> | 2025-02-19 18:28:03 +0530 |
commit | 893b439ccb9511ed4a5595bdf8048bb637da1200 (patch) | |
tree | 5885be596e283a719166ba6af9339c3095bc471d /evict.go | |
parent | Bootstraped code for housekeeping operations (diff) | |
download | cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.gz cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.bz2 cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.lz cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.xz cache-893b439ccb9511ed4a5595bdf8048bb637da1200.tar.zst cache-893b439ccb9511ed4a5595bdf8048bb637da1200.zip |
Added Eviction and Options setup
Diffstat (limited to 'evict.go')
-rw-r--r-- | evict.go | 123 |
1 files changed, 73 insertions, 50 deletions
@@ -5,88 +5,100 @@ import "errors" type EvictionPolicyType int const ( - StrategyNone EvictionPolicyType = iota - StrategyFIFO - StrategyLRU - StrategyLFU + PolicyNone EvictionPolicyType = iota + PolicyFIFO + PolicyLRU + PolicyLFU + PolicyLTR ) -type EvictionStrategies interface { - OnInsert(n *Node) - OnAccess(n *Node) - Evict() *Node +type evictionStrategies interface { + OnInsert(n *node) + OnAccess(n *node) + Evict() *node } -type EvictionPolicy struct { - EvictionStrategies +type evictionPolicy struct { + evictionStrategies Type EvictionPolicyType - evict *Node + evict *node } -func (e *EvictionPolicy) SetPolicy(y EvictionPolicyType) error { - store := map[EvictionPolicyType]func() EvictionStrategies{ - StrategyNone: func() EvictionStrategies { - return NoneStrategies{evict: e.evict} +func (e *evictionPolicy) SetPolicy(y EvictionPolicyType) error { + store := map[EvictionPolicyType]func() evictionStrategies{ + PolicyNone: func() evictionStrategies { + return nonePolicy{evict: e.evict} }, - StrategyFIFO: func() EvictionStrategies { - return FIFOStrategies{evict: e.evict} + PolicyFIFO: func() evictionStrategies { + return fifoPolicy{evict: e.evict} }, - StrategyLRU: func() EvictionStrategies { - return LRUStrategies{evict: e.evict} + PolicyLRU: func() evictionStrategies { + return lruPolicy{evict: e.evict} + }, + PolicyLFU: func() evictionStrategies { + return lfuPolicy{evict: e.evict} }, } factory, ok := store[y] if !ok { - return errors.New("Invalid Policy") + return errors.New("invalid olicy") } - e.EvictionStrategies = factory() + e.evictionStrategies = factory() return nil } -type NoneStrategies struct { - evict *Node +type nonePolicy struct { + evict *node } -func (s NoneStrategies) OnInsert(node *Node) { +func (s nonePolicy) OnInsert(node *node) { node.EvictPrev = s.evict node.EvictNext = node.EvictPrev.EvictNext node.EvictNext.EvictPrev = node node.EvictPrev.EvictNext = node } -func (NoneStrategies) OnAccess(n *Node) { +func (nonePolicy) OnAccess(n *node) { } -func (NoneStrategies) Evict() *Node { +func (nonePolicy) Evict() *node { return nil } -type FIFOStrategies struct { - evict *Node +type fifoPolicy struct { + evict *node } -func (s FIFOStrategies) OnInsert(node *Node) { +func (s fifoPolicy) OnInsert(node *node) { node.EvictPrev = s.evict node.EvictNext = node.EvictPrev.EvictNext node.EvictNext.EvictPrev = node node.EvictPrev.EvictNext = node } -func (FIFOStrategies) OnAccess(n *Node) { +func (fifoPolicy) OnAccess(n *node) { } -func (s FIFOStrategies) Evict() *Node { - return s.evict.EvictPrev +func (s fifoPolicy) Evict() *node { + if s.evict.EvictPrev != s.evict { + return s.evict.EvictPrev + } else { + return nil + } } -type LRUStrategies struct { - evict *Node +type lruPolicy struct { + evict *node } -func (s LRUStrategies) OnInsert(node *Node) { +func (s lruPolicy) OnInsert(node *node) { + node.EvictPrev = s.evict + node.EvictNext = node.EvictPrev.EvictNext + node.EvictNext.EvictPrev = node + node.EvictPrev.EvictNext = node } -func (s LRUStrategies) OnAccess(node *Node) { +func (s lruPolicy) OnAccess(node *node) { node.EvictNext.EvictPrev = node.EvictPrev node.EvictPrev.EvictNext = node.EvictNext @@ -96,36 +108,43 @@ func (s LRUStrategies) OnAccess(node *Node) { node.EvictPrev.EvictNext = node } -func (s LRUStrategies) Evict() *Node { - return s.evict.EvictPrev +func (s lruPolicy) Evict() *node { + if s.evict.EvictPrev != s.evict { + return s.evict.EvictPrev + } else { + return nil + } } -type LFUStrategies struct { - evict *Node +type lfuPolicy struct { + evict *node } -func (s LFUStrategies) OnInsert(node *Node) { +func (s lfuPolicy) OnInsert(node *node) { node.EvictPrev = s.evict node.EvictNext = node.EvictPrev.EvictNext node.EvictNext.EvictPrev = node node.EvictPrev.EvictNext = node + node.Access = 0 } -func (s LFUStrategies) OnAccess(node *Node) { - node.Access += 1 +func (s lfuPolicy) OnAccess(node *node) { + node.Access++ - node.EvictNext.EvictPrev = node.EvictPrev - node.EvictPrev.EvictNext = node.EvictNext + for v := node.EvictPrev; v.EvictPrev != s.evict; v = v.EvictPrev { + if v.Access <= node.Access { + node.EvictNext.EvictPrev = node.EvictPrev + node.EvictPrev.EvictNext = node.EvictNext - for v := node.EvictPrev; v != s.evict; v = v.EvictPrev { - if v.Access >= node.Access { node.EvictPrev = v node.EvictNext = node.EvictPrev.EvictNext node.EvictNext.EvictPrev = node node.EvictPrev.EvictNext = node - break + return } } + node.EvictNext.EvictPrev = node.EvictPrev + node.EvictPrev.EvictNext = node.EvictNext node.EvictPrev = s.evict node.EvictNext = node.EvictPrev.EvictNext @@ -133,6 +152,10 @@ func (s LFUStrategies) OnAccess(node *Node) { node.EvictPrev.EvictNext = node } -func (s LFUStrategies) Evict() *Node { - return s.evict.EvictPrev +func (s lfuPolicy) Evict() *node { + if s.evict.EvictPrev != s.evict { + return s.evict.EvictPrev + } else { + return nil + } } |