예제 #1
0
        /// <summary>
        /// Gets the specified name.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name">The name.</param>
        /// <param name="callback">The callback.</param>
        /// <param name="args">The arguments.</param>
        /// <returns></returns>
        public T Get <T>(string name, Func <string, object[], CacheDataInfo <T> > callback = null, params object[] args)
        {
            var value = _container.Get(name);

            if (value.HasValue)
            {
                var cInfo = _serialier.Deserialize <CacheDataInfo <T> >(value);
                if (_container.SupportsExpiration || !HasExpired(cInfo))
                {
                    return(cInfo.NewCacheData);
                }

                Remove(name);
            }

            if (callback == null)
            {
                return(default(T));
            }

            using (var cacheLock = _cacheKeyLockAcquisition.AcquireLock(_redisDb, name))
            {
                value = _container.Get(name);
                if (!value.HasValue)
                {
                    var cData = callback(name, args);
                    if (cData == null)
                    {
                        return(default(T));
                    }

                    Set(name, cData.NewCacheData, cData.KeepAlive);
                    return(cData.NewCacheData);
                }

                var cInfo = _serialier.Deserialize <CacheDataInfo <T> >(value);
                return(cInfo.NewCacheData);
            }
        }
예제 #2
0
        /// <summary>
        /// Gets the specified name.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="name">The name.</param>
        /// <param name="callback">The callback.</param>
        /// <param name="args">The arguments.</param>
        /// <returns></returns>
        public T Get <T>(string name, Func <string, object[], CacheDataInfo <T> > callback = null, params object[] args)
        {
            var value = _container.Get(name);

            if (value.HasValue)
            {
                var cInfo = _serialier.Deserialize <CacheDataInfo <T> >(value);
                if (_container.SupportsExpiration || !HasExpired(cInfo))
                {
                    return(cInfo.NewCacheData);
                }

                Remove(name);
            }

            if (callback == null)
            {
                return(default);