public bool SetValue(TKey key, TValue value, DateTime expirationTime) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (value == null) { throw new ArgumentNullException(nameof(value)); } // if item already expired, do not add it to the cache if the _removeExpiredValues setting is set to true if (_removeExpiredValues && expirationTime < DateTime.UtcNow) { return(false); } // just need to update value and move it to the top if (_map.TryGetValue(key, out var cacheItem)) { cacheItem.Value = value; cacheItem.ExpirationTime = expirationTime; _eventQueue.Add(() => { _doubleLinkedList.Remove(cacheItem); _doubleLinkedList.AddFirst(cacheItem); }); } else { // if cache is at _maxCapacityPercentage, trim it by _compactionPercentage if ((double)_map.Count / _capacity >= _maxCapacityPercentage) { _eventQueue.Add(() => { RemoveLRUs(); }); } // add the new node var newCacheItem = new LRUCacheItem <TKey, TValue>(key, value, expirationTime); _eventQueue.Add(() => { // Add a remove operation in case two threads are trying to add the same value. Only the second remove will succeed in this case. _doubleLinkedList.Remove(newCacheItem); _doubleLinkedList.AddFirst(newCacheItem); }); _map[key] = newCacheItem; } return(true); }
public override bool Equals(object obj) { LRUCacheItem <TKey, TValue> item = obj as LRUCacheItem <TKey, TValue>; return(item != null && Key.Equals(item.Key)); }