private long _lastExpire; // last time expiration ran /// <summary> /// Initializes a new instance of the <see cref="NearCacheBase"/> class. /// </summary> /// <param name="name">The name of the cache.</param> /// <param name="cluster">The cluster.</param> /// <param name="serializationService">The localization service.</param> /// <param name="loggerFactory">A logger factory.</param> /// <param name="nearCacheOptions">NearCache options.</param> protected NearCacheBase(string name, Cluster cluster, SerializationService serializationService, ILoggerFactory loggerFactory, NearCacheOptions nearCacheOptions) { if (string.IsNullOrWhiteSpace(name)) { throw new ArgumentException(ExceptionMessages.NullOrEmpty, nameof(name)); } Name = name; Cluster = cluster ?? throw new ArgumentNullException(nameof(cluster)); SerializationService = serializationService ?? throw new ArgumentNullException(nameof(serializationService)); LoggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); Options = nearCacheOptions ?? throw new ArgumentNullException(nameof(nearCacheOptions)); _entries = new ConcurrentAsyncDictionary <IData, NearCacheEntry>(); Statistics = new NearCacheStatistics(name); _lastExpire = Clock.Never; _maxSize = nearCacheOptions.MaxSize; _maxIdleMilliseconds = nearCacheOptions.MaxIdleSeconds * 1000; InMemoryFormat = nearCacheOptions.InMemoryFormat; _timeToLive = nearCacheOptions.TimeToLiveSeconds * 1000; _evictionPolicy = nearCacheOptions.EvictionPolicy; _evictionComparer = GetEvictionComparer(_evictionPolicy); _evictionPercentage = nearCacheOptions.EvictionPercentage; _cleanupInterval = nearCacheOptions.CleanupPeriodSeconds * 1000; }
public async Task Test() { var d = new ConcurrentAsyncDictionary <string, ValueItem <int> >(); var i = 0; ValueTask <ValueItem <int> > Factory(string key, CancellationToken _) { i++; return(new ValueTask <ValueItem <int> >(new ValueItem <int>(2))); } var v = await d.GetOrAddAsync("a", Factory); Assert.AreEqual(2, v.Value); Assert.AreEqual(1, i); v = await d.GetOrAddAsync("a", Factory); Assert.AreEqual(2, v.Value); Assert.AreEqual(1, i); var entries = new List <string>(); await foreach (var(key, value) in d) { entries.Add($"{key}:{value}"); } Assert.AreEqual(1, entries.Count); Assert.AreEqual("a:2", entries[0]); var(hasValue, gotValue) = await d.TryGetAsync("a"); Assert.IsTrue(hasValue); Assert.AreEqual(2, gotValue.Value); Assert.IsTrue(d.TryRemove("a")); Assert.IsFalse(d.TryRemove("a")); (hasValue, _) = await d.TryGetAsync("a"); Assert.IsFalse(hasValue);