Ejemplo n.º 1
0
        public async Task <V> Get <K, V>(string cacheConfiguration, Func <Task <V> > creator, string prefix, K key)
        {
            var versionMappingKey = $"{typeof(K).FullName}-{typeof(V).FullName}";
            var configuration     = JsonSerializerHelper.Deserialize <KVCacheConfiguration>(cacheConfiguration);

            if (!_datas.TryGetValue(prefix, out CacheContainer cacheContainer))
            {
                await _lock.WaitAsync();

                try
                {
                    if (!_datas.TryGetValue(prefix, out cacheContainer))
                    {
                        var(versionService, versionname) = getVersionService(configuration, versionMappingKey);
                        var version = await versionService.GetVersion(versionname);

                        cacheContainer = new CacheContainer()
                        {
                            Version = version, LatestVersionTime = DateTime.UtcNow, CacheDict = new HashLinkedCache <object, CacheValueContainer>()
                            {
                                Length = configuration.MaxLength
                            }
                        };
                        _datas[prefix] = cacheContainer;
                    }
                }
                finally
                {
                    _lock.Release();
                }
            }
            else
            {
                if ((DateTime.UtcNow - cacheContainer.LatestVersionTime).TotalSeconds > configuration.VersionCallTimeout)
                {
                    await _lock.WaitAsync();

                    try
                    {
                        if ((DateTime.UtcNow - cacheContainer.LatestVersionTime).TotalSeconds > configuration.VersionCallTimeout)
                        {
                            var(versionService, versionname) = getVersionService(configuration, versionMappingKey);
                            var version = await versionService.GetVersion(versionname);

                            if (version != cacheContainer.Version)
                            {
                                cacheContainer = new CacheContainer()
                                {
                                    Version = version, LatestVersionTime = DateTime.UtcNow, CacheDict = new HashLinkedCache <object, CacheValueContainer>()
                                    {
                                        Length = configuration.MaxLength
                                    }
                                };
                                _datas[prefix] = cacheContainer;
                            }
                            else
                            {
                                cacheContainer.LatestVersionTime = DateTime.UtcNow;
                            }
                        }
                    }
                    finally
                    {
                        _lock.Release();
                    }
                }
            }



            var valueItem = cacheContainer.CacheDict.GetValue(key);

            if (valueItem == null)
            {
                await cacheContainer.SyncOperate(
                    async() =>
                {
                    valueItem = cacheContainer.CacheDict.GetValue(key);
                    if (valueItem == null)
                    {
                        var cacheValue = await creator();
                        valueItem      = new CacheValueContainer()
                        {
                            Value = cacheValue
                        };
                        cacheContainer.CacheDict.SetValue(key, valueItem);
                    }
                }
                    );
            }

            return((V)valueItem.Value);
        }
Ejemplo n.º 2
0
        public void SetSync <K, V>(string cacheConfiguration, string prefix, K key, V value)
        {
            var versionMappingKey = $"{typeof(K).FullName}-{typeof(V).FullName}";
            var configuration     = JsonSerializerHelper.Deserialize <KVCacheConfiguration>(cacheConfiguration);

            if (!_datas.TryGetValue(prefix, out CacheContainer cacheContainer))
            {
                _lock.Wait();
                try
                {
                    if (!_datas.TryGetValue(prefix, out cacheContainer))
                    {
                        var(versionService, versionname) = getVersionService(configuration, versionMappingKey);
                        var version = versionService.GetVersionSync(versionname);
                        cacheContainer = new CacheContainer()
                        {
                            Version = version, LatestVersionTime = DateTime.UtcNow, CacheDict = new HashLinkedCache <object, CacheValueContainer>()
                            {
                                Length = configuration.MaxLength
                            }
                        };
                        _datas[prefix] = cacheContainer;
                    }
                }
                finally
                {
                    _lock.Release();
                }
            }
            else
            {
                if ((DateTime.UtcNow - cacheContainer.LatestVersionTime).TotalSeconds > configuration.VersionCallTimeout)
                {
                    _lock.Wait();
                    try
                    {
                        if ((DateTime.UtcNow - cacheContainer.LatestVersionTime).TotalSeconds > configuration.VersionCallTimeout)
                        {
                            var(versionService, versionname) = getVersionService(configuration, versionMappingKey);
                            var version = versionService.GetVersionSync(versionname);
                            if (version != cacheContainer.Version)
                            {
                                cacheContainer = new CacheContainer()
                                {
                                    Version = version, LatestVersionTime = DateTime.UtcNow, CacheDict = new HashLinkedCache <object, CacheValueContainer>()
                                    {
                                        Length = configuration.MaxLength
                                    }
                                };
                                _datas[prefix] = cacheContainer;
                            }
                            else
                            {
                                cacheContainer.LatestVersionTime = DateTime.UtcNow;
                            }
                        }
                    }
                    finally
                    {
                        _lock.Release();
                    }
                }
            }

            var valueItem = new CacheValueContainer()
            {
                Value = value
            };

            cacheContainer.CacheDict.SetValue(key, valueItem);
        }