public override TimeSpan BaseGetExpiration(string cacheKey)
        {
            TimeSpan timeSpan = _memoryProvider.GetExpiration(cacheKey);

            if (timeSpan == TimeSpan.Zero)
            {
                timeSpan = _redisProvider.GetExpiration(cacheKey);
            }
            return(timeSpan);
        }
        public override CacheValue <T> BaseGet <T>(string cacheKey, Func <T> dataRetriever, TimeSpan expiration)
        {
            CacheValue <T> cacheValue = _memoryProvider.Get <T>(cacheKey);

            if (cacheValue.IsNull)
            {
                cacheValue = _redisProvider.Get <T>(cacheKey);
                if (cacheValue.HasValue)
                {
                    var expration = _redisProvider.GetExpiration(cacheKey);
                    if (expration != null && expration != TimeSpan.Zero)
                    {
                        _memoryProvider.Set <T>(cacheKey, cacheValue.Value, expration);
                    }
                }
            }
            if (cacheValue.HasValue)
            {
                return(cacheValue);
            }
            T data = dataRetriever();

            if (data != null)
            {
                _memoryProvider.Set <T>(cacheKey, data, expiration);
                _redisProvider.Set <T>(cacheKey, data, expiration);
                return(new CacheValue <T>(data, true));
            }
            return(new CacheValue <T>(data, false));
        }