コード例 #1
0
        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);