/// <summary> /// Attempt to add a item to the cache. /// </summary> /// <param name="key">Key to use when adding item</param> /// <param name="item">Item of type 'T' to add to cache</param> /// <param name="expirationTime">The expiration time of the entry.</param> /// <returns>true if item was added, false if item was not added</returns> /// <exception cref="LimitExceededException">Thrown if an attempt is made to add an item when the current /// cache size is equal to the capacity</exception> public virtual bool TryAdd(string key, T item, DateTime expirationTime) { Purge(); // -1 milleseconds is infinite timeout _readWriteLock.AcquireWriterLock(TimeSpan.FromMilliseconds(-1)); try { EnforceQuota(); } catch { _readWriteLock.ReleaseWriterLock(); throw; } try { if (_items.ContainsKey(key)) { return(false); } else { _items[key] = new ExpirableItem <T>(item, expirationTime); return(true); } } finally { _readWriteLock.ReleaseWriterLock(); } }
public void ExplicitCastTest() { ExpirableItem <string> item = new ExpirableItem <string>("foobar", DateTime.MaxValue); string s = (string)item; Assert.AreEqual(item.Value, s); }
protected bool TryReplaceItem(object key, object item, DateTime expirationTime) { bool lockHeld = false; try { try { } finally { CacheLock.AcquireWriterLock(-1); lockHeld = true; } PurgeIfNeeded(); EnforceQuota(); if (!(Entries[key] is IExpirableItem currentItem) || IsExpired(currentItem)) { return(false); } else { Entries[key] = new ExpirableItem(item, expirationTime); if (currentItem != null && _doRemoveNotification) { OnRemove(ExtractItem(currentItem)); } StartTimerIfNeeded(); return(true); } }
protected object ExtractItem(IExpirableItem val) { ExpirableItem item = val as ExpirableItem; if (item != null) { return(item.Item); } return(val); }
protected object ExtractItem(IExpirableItem val) { ExpirableItem wrapper = (val as ExpirableItem); if (wrapper != null) { return(wrapper.Item); } else { return(val); } }
protected bool TryReplaceItem(object key, object item, DateTime expirationTime) { bool lockHeld = false; try { try { } finally { _cacheLock.EnterWriteLock(); lockHeld = true; } PurgeIfNeeded(); EnforceQuota(); IExpirableItem currentItem = _entries[key] as IExpirableItem; if (currentItem == null || IsExpired(currentItem)) { return(false); } else { _entries[key] = new ExpirableItem(item, expirationTime); if (currentItem != null && _doRemoveNotification) { this.OnRemove(ExtractItem(currentItem)); } StartTimerIfNeeded(); return(true); } } finally { if (lockHeld) { _cacheLock.ExitWriteLock(); } } }
public void Insert(string username, AccountStatus status) { double seconds; DateTime expire_curr_timestamp; // purge all invalid/expired records // check if we came from future(?!) or all data exceeds "expire" time while (true) { expire_curr_timestamp = DateTime.UtcNow; seconds = (expire_last_timestamp - expire_curr_timestamp).TotalSeconds; if (seconds >= 0 && seconds < expire) { break; } Clear(); } int index = (int)(expire_intervals * (seconds / expire)); // purge selected expired records if (expire_last_index != index) { for (int i = expire_last_index + 1; i < expire_last_index + expire_intervals; i++) { int curr_index = i % expire_intervals; foreach (string ausername in expire_sets[i]) { data.Remove(ausername); } expire_sets[i].Clear(); if (curr_index == index) { break; } } } // remove oldest cached data when we reach max_size quota if (data.Count > max_size) { for (int i = expire_intervals + index - 1; i > index; i--) { int curr_index = i % expire_intervals; foreach (string ausername in expire_sets[i]) { data.Remove(ausername); } expire_sets[i].Clear(); } // NOTE: now we should check if all data doesn't sit in expire_sets[index] // and remove oldest record (or some fraction of oldest records) } // remove old record for username ExpirableItem last; if (data.TryGetValue(username, out last)) { expire_sets[last.Index].Remove(username); data.Remove(username); } data[username] = new ExpirableItem(status, expire, index); expire_sets[index].Add(username); }
public void ExplicitCastTest() { ExpirableItem<string> item = new ExpirableItem<string>("foobar", DateTime.MaxValue); string s = (string)item; Assert.AreEqual(item.Value, s); }
public void Insert(string username, AccountStatus status) { double seconds; DateTime expire_curr_timestamp; // purge all invalid/expired records // check if we came from future(?!) or all data exceeds "expire" time while (true) { expire_curr_timestamp = DateTime.UtcNow; seconds = (expire_last_timestamp - expire_curr_timestamp).TotalSeconds; if (seconds >= 0 && seconds < expire) break; Clear(); } int index = (int) (expire_intervals * (seconds / expire)); // purge selected expired records if (expire_last_index != index) { for (int i = expire_last_index + 1; i < expire_last_index + expire_intervals; i++) { int curr_index = i % expire_intervals; foreach (string ausername in expire_sets[i]) { data.Remove(ausername); } expire_sets[i].Clear(); if (curr_index == index) break; } } // remove oldest cached data when we reach max_size quota if (data.Count > max_size) { for (int i = expire_intervals + index - 1; i > index; i--) { int curr_index = i % expire_intervals; foreach (string ausername in expire_sets[i]) { data.Remove(ausername); } expire_sets[i].Clear(); } // NOTE: now we should check if all data doesn't sit in expire_sets[index] // and remove oldest record (or some fraction of oldest records) } // remove old record for username ExpirableItem last; if (data.TryGetValue(username, out last)) { expire_sets[last.Index].Remove(username); data.Remove(username); } data[username] = new ExpirableItem(status, expire, index); expire_sets[index].Add(username); }