mirror of
https://github.com/idanoo/autobrr
synced 2025-07-23 08:49:13 +00:00
feat(cache): implement TTLCache and TimeCache (#1822)
* feat(pkg): implement ttlcache and timecache
This commit is contained in:
parent
acef4ac624
commit
c1d8a4a850
8 changed files with 742 additions and 21 deletions
111
pkg/ttlcache/internal.go
Normal file
111
pkg/ttlcache/internal.go
Normal file
|
@ -0,0 +1,111 @@
|
|||
package ttlcache
|
||||
|
||||
import "time"
|
||||
|
||||
func (c *Cache[K, V]) get(key K) (Item[V], bool) {
|
||||
c.l.RLock()
|
||||
defer c.l.RUnlock()
|
||||
return c._g(key)
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) _g(key K) (Item[V], bool) {
|
||||
v, ok := c.m[key]
|
||||
if !ok {
|
||||
return v, ok
|
||||
}
|
||||
|
||||
return v, ok
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) set(key K, it Item[V]) Item[V] {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
return c._s(key, it)
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) _s(key K, it Item[V]) Item[V] {
|
||||
it.d, it.t = c.getDuration(it.d)
|
||||
c.m[key] = it
|
||||
c.ch <- it.t
|
||||
return it
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) getOrSet(key K, it Item[V]) (Item[V], bool) {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
return c._gos(key, it)
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) _gos(key K, it Item[V]) (Item[V], bool) {
|
||||
if g, ok := c._g(key); ok {
|
||||
return g, ok
|
||||
}
|
||||
|
||||
return c._s(key, it), true
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) delete(key K, reason DeallocationReason) {
|
||||
var v Item[V]
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
|
||||
if c.o.deallocationFunc != nil {
|
||||
var ok bool
|
||||
v, ok = c.m[key]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
c.deleteUnsafe(key, v, reason)
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) deleteUnsafe(key K, v Item[V], reason DeallocationReason) {
|
||||
delete(c.m, key)
|
||||
|
||||
if c.o.deallocationFunc != nil {
|
||||
c.o.deallocationFunc(key, v.v, reason)
|
||||
}
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) getkeys() []K {
|
||||
c.l.RLock()
|
||||
defer c.l.RUnlock()
|
||||
|
||||
keys := make([]K, len(c.m))
|
||||
for k := range c.m {
|
||||
keys = append(keys, k)
|
||||
}
|
||||
|
||||
return keys
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) close() {
|
||||
c.l.Lock()
|
||||
defer c.l.Unlock()
|
||||
close(c.ch)
|
||||
}
|
||||
|
||||
func (c *Cache[K, V]) getDuration(d time.Duration) (time.Duration, time.Time) {
|
||||
switch d {
|
||||
case NoTTL:
|
||||
case DefaultTTL:
|
||||
return c.o.defaultTTL, c.tc.Now().Add(c.o.defaultTTL)
|
||||
default:
|
||||
return d, c.tc.Now().Add(d)
|
||||
}
|
||||
|
||||
return NoTTL, time.Time{}
|
||||
}
|
||||
|
||||
func (i *Item[V]) getDuration() time.Duration {
|
||||
return i.d
|
||||
}
|
||||
|
||||
func (i *Item[V]) getTime() time.Time {
|
||||
return i.t
|
||||
}
|
||||
|
||||
func (i *Item[V]) getValue() V {
|
||||
return i.v
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue