@@ -522,29 +522,31 @@ func (lru *LRU[K, V]) getAndRefresh(hash uint32, key K) (value V, ok bool) {
522
522
return
523
523
}
524
524
525
- func (lru * LRU [K , V ]) GetAndRefreshOrAdd (key K , constructor func () (V , bool )) (V , bool ) {
526
- return lru .getAndRefreshOrAdd (lru .hash (key ), key , constructor )
525
+ func (lru * LRU [K , V ]) GetAndRefreshOrAdd (key K , constructor func () (V , bool )) (V , bool , bool ) {
526
+ value , updated , ok := lru .getAndRefreshOrAdd (lru .hash (key ), key , constructor )
527
+ if ! updated && ok {
528
+ lru .PurgeExpired ()
529
+ }
530
+ return value , updated , ok
527
531
}
528
532
529
- func (lru * LRU [K , V ]) getAndRefreshOrAdd (hash uint32 , key K , constructor func () (V , bool )) (value V , ok bool ) {
533
+ func (lru * LRU [K , V ]) getAndRefreshOrAdd (hash uint32 , key K , constructor func () (V , bool )) (value V , updated bool , ok bool ) {
530
534
if pos , ok := lru .findKeyNoExpire (hash , key ); ok {
531
535
if pos != lru .head {
532
536
lru .unlinkElement (pos )
533
537
lru .setHead (pos )
534
538
}
535
539
lru .metrics .Hits ++
536
540
lru .elements [pos ].expire = expire (lru .lifetime )
537
- return lru .elements [pos ].value , ok
541
+ return lru .elements [pos ].value , true , true
538
542
}
539
-
540
543
lru .metrics .Misses ++
541
544
value , ok = constructor ()
542
545
if ! ok {
543
546
return
544
547
}
545
548
lru .addWithLifetime (hash , key , value , lru .lifetime )
546
- lru .PurgeExpired ()
547
- return value , false
549
+ return value , false , true
548
550
}
549
551
550
552
// Peek looks up a key's value from the cache, without changing its recent-ness.
0 commit comments