/// <summary> /// Get the specified cacheKey, dataRetriever and expiration. /// </summary> /// <returns>The get.</returns> /// <param name="cacheKey">Cache key.</param> /// <param name="dataRetriever">Data retriever.</param> /// <param name="expiration">Expiration.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public override CacheValue <T> BaseGet <T>(string cacheKey, Func <T> dataRetriever, TimeSpan expiration) { ArgumentCheck.NotNullOrWhiteSpace(cacheKey, nameof(cacheKey)); ArgumentCheck.NotNegativeOrZero(expiration, nameof(expiration)); ////mutex key //Lock(cacheKey); var result = _cache.Get <T>(cacheKey); if (result.HasValue) { if (_options.EnableLogging) { _logger?.LogInformation($"Cache Hit : cachekey = {cacheKey}"); } CacheStats.OnHit(); return(result); } CacheStats.OnMiss(); if (_options.EnableLogging) { _logger?.LogInformation($"Cache Missed : cachekey = {cacheKey}"); } if (!_cache.Add($"{cacheKey}_Lock", 1, TimeSpan.FromMilliseconds(_options.LockMs))) { System.Threading.Thread.Sleep(_options.SleepMs); return(Get(cacheKey, dataRetriever, expiration)); } var res = dataRetriever(); if (res != null) { Set(cacheKey, res, expiration); //remove mutex key _cache.Remove($"{cacheKey}_Lock"); return(new CacheValue <T>(res, true)); } else { //remove mutex key _cache.Remove($"{cacheKey}_Lock"); return(CacheValue <T> .NoValue); } }
public bool TrySet <T>(string cacheKey, T cacheValue, TimeSpan expiration) { if (string.IsNullOrWhiteSpace(cacheKey)) { throw new ArgumentNullException(nameof(cacheKey)); } if (cacheValue == null) { throw new ArgumentNullException(nameof(cacheValue)); } return(_cache.Add(cacheKey, cacheValue, expiration)); }
/// <summary> /// Get the specified cacheKey, dataRetriever and expiration. /// </summary> /// <returns>The get.</returns> /// <param name="cacheKey">Cache key.</param> /// <param name="dataRetriever">Data retriever.</param> /// <param name="expiration">Expiration.</param> /// <typeparam name="T">The 1st type parameter.</typeparam> public override CacheValue <T> BaseGet <T>(string cacheKey, Func <T> dataRetriever, TimeSpan expiration) { ArgumentCheck.NotNullOrWhiteSpace(cacheKey, nameof(cacheKey)); ArgumentCheck.NotNegativeOrZero(expiration, nameof(expiration)); ////mutex key //Lock(cacheKey); var result = _cache.Get <T>(cacheKey); if (result.HasValue) { OnCacheMiss(cacheKey); return(result); } OnCacheMiss(cacheKey); if (!_cache.Add($"{cacheKey}_Lock", 1, TimeSpan.FromMilliseconds(_options.LockMs))) { System.Threading.Thread.Sleep(_options.SleepMs); return(Get(cacheKey, dataRetriever, expiration)); } var res = dataRetriever(); if (res != null || _options.CacheNulls) { Set(cacheKey, res, expiration); //remove mutex key _cache.Remove($"{cacheKey}_Lock"); return(new CacheValue <T>(res, true)); } else { //remove mutex key _cache.Remove($"{cacheKey}_Lock"); return(CacheValue <T> .NoValue); } }