示例#1
0
        private ValuesToStore <T> SaveToFirstLevelCacheAndGetSerializedValuesForSecondLevelCache <T>(Dictionary <CacheItemDefinition, T> objects)
            where T : class
        {
            var result = new ValuesToStore <T>();

            foreach (var kvp in objects)
            {
                if (kvp.Value != null)
                {
                    if (SerializationProvider.CanSerialize(kvp.Value.GetType()))
                    {
                        var bytes = SerializationProvider.Serialize(kvp.Value);
                        result.InSecondLevelCache.Add(kvp.Key, bytes);
                        result.InFirstLevelCache.Add(kvp.Key, bytes);
                    }
                    else
                    {
                        var ph = new NonSerializableObjectPlaceHolder();
                        result.InNonSerializableCache.Add(kvp.Key, kvp.Value);

                        byte[] bytes = SerializationProvider.Serialize(ph);
                        result.InSecondLevelCache.Add(kvp.Key, bytes);
                    }
                }
            }

            return(result);
        }
示例#2
0
        /// <inheritdoc/>
        public async Task SetAsync <T>(string key,
                                       T value,
                                       TimeSpan?ttl)
            where T : class
        {
            GuardDisposed();

            if (value == null)
            {
                return;
            }

            await Task.Yield();

            if (SerializationProvider.CanSerialize(value.GetType()))
            {
                var bytes = SerializationProvider.Serialize(value);

                await SecondLevelCache.SetAsync(key, bytes, ttl : ttl).ConfigureAwait(false);

                FirstLevelCache.Set(key, bytes, ttl: ttl);
            }
            else
            {
                var ph        = new NonSerializableObjectPlaceHolder();
                var ttlResult = SecondLevelCache.GetTimeToLive(key);

                if (ttlResult.KeyExists)
                {
                    NonSerializableCache.Set(key, value, ttl: ttlResult.TimeToLive);
                }
                else
                {
                    byte[] bytes = SerializationProvider.Serialize(ph);
                    await SecondLevelCache.SetAsync(key, bytes, ttl : ttl).ConfigureAwait(false);

                    NonSerializableCache.Set(key, value, ttl: ttl);
                }
            }
        }
示例#3
0
        /// <inheritdoc/>
        public void Set <T>(string key,
                            T value,
                            TimeSpan?ttl)
            where T : class
        {
            GuardDisposed();

            if (value == null)
            {
                return;
            }

            if (SerializationProvider.CanSerialize(value.GetType()))
            {
                byte[] bytes = SerializationProvider.Serialize(value);

                SecondLevelCache.Set(key, bytes, ttl: ttl);
                FirstLevelCache.Set(key, bytes, ttl: ttl);
            }
            else
            {
                var ph        = new NonSerializableObjectPlaceHolder();
                var ttlResult = SecondLevelCache.GetTimeToLive(key);

                if (ttlResult.KeyExists)
                {
                    NonSerializableCache.Set(key, value, ttl: ttlResult.TimeToLive);
                }
                else
                {
                    byte[] bytes = SerializationProvider.Serialize(ph);
                    SecondLevelCache.Set(key, bytes, ttl: ttl);
                    NonSerializableCache.Set(key, value, ttl: ttl);
                }
            }
        }