/// <summary> /// 查询缓存键对应的缓存值的数量。 /// </summary> /// <param name="key">缓存键。</param> public async Task <int> GetTeacherCountsAsync(string key) { ConditionalValue <CacheWrapper <Teacher> > result = await StateManager.TryGetStateAsync <CacheWrapper <Teacher> >(key); if (!result.HasValue) { return(0); } CacheWrapper <Teacher> cacheWrapper = result.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return(0); } // 刷新滑动过期时间。 (bool needRestore, CacheWrapper <Teacher> cacheWrapper)refreshResult = cacheWrapper.Refresh(); if (refreshResult.needRestore) { await StateManager.SetStateAsync(key, refreshResult.cacheWrapper); } return(refreshResult.cacheWrapper.Caches.Count); }
/// <summary> /// 查询缓存。 /// </summary> /// <param name="key">缓存键。</param> public async Task <Student> GetSmartCacheAsync(string key) { ConditionalValue <CacheWrapper <Student> > result = await StateManager.TryGetStateAsync <CacheWrapper <Student> >(key); if (!result.HasValue) { return(null); } CacheWrapper <Student> cacheWrapper = result.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return(null); } // 刷新滑动过期时间。 (bool needRestore, CacheWrapper <Student> cacheWrapper)refreshResult = cacheWrapper.Refresh(); if (refreshResult.needRestore) { await StateManager.SetStateAsync(key, refreshResult.cacheWrapper); } return(refreshResult.cacheWrapper.Caches.FirstOrDefault()); }
public async Task RemoveTeacherSmartCacheValuesAsync(string key, List <Teacher> values) { ConditionalValue <CacheWrapper <Teacher> > result = await StateManager.TryGetStateAsync <CacheWrapper <Teacher> >(key); if (!result.HasValue) { return; } CacheWrapper <Teacher> cacheWrapper = result.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return; } values.Select(t => cacheWrapper.Caches.Remove(t)); if (cacheWrapper.Caches.Count == 0) { await StateManager.RemoveStateAsync(key); } await StateManager.SetStateAsync(key, cacheWrapper); }
/// <summary> /// 移除缓存键中指定的缓存值。 /// </summary> /// <param name="key">缓存键。</param> /// <param name="value">被移除的缓存值。</param> public async Task RemoveSmartCacheValueAsync(string key, Student value) { ConditionalValue <CacheWrapper <Student> > result = await StateManager.TryGetStateAsync <CacheWrapper <Student> >(key); if (!result.HasValue) { return; } CacheWrapper <Student> cacheWrapper = result.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return; } cacheWrapper.Caches.Remove(value); if (cacheWrapper.Caches.Count == 0) { await StateManager.RemoveStateAsync(key); } await StateManager.SetStateAsync(key, cacheWrapper); }
/// <summary> /// 查询缓存。 /// </summary> /// <param name="key">缓存键。</param> /// <param name="top">返回结果数量。</param> public async Task <List <Teacher> > GetTeacherTopSmartCachesAsync(string key, int top) { ConditionalValue <CacheWrapper <Teacher> > result = await StateManager.TryGetStateAsync <CacheWrapper <Teacher> >(key); if (!result.HasValue) { return(null); } CacheWrapper <Teacher> cacheWrapper = result.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return(null); } // 刷新滑动过期时间。 (bool needRestore, CacheWrapper <Teacher> cacheWrapper)refreshResult = cacheWrapper.Refresh(); if (refreshResult.needRestore) { await StateManager.SetStateAsync(key, refreshResult.cacheWrapper); } return(refreshResult.cacheWrapper.Caches.GetRange(0, top)); }
/// <summary> /// 获取缓存。 /// </summary> /// <param name="key">缓存的主键。</param> public async Task <string> GetCacheAsync(string key) { ConditionalValue <CacheWrapper> result = await StateManager.TryGetStateAsync <CacheWrapper>(key); if (!result.HasValue) { return(null); } CacheWrapper cacheWrapper = result.Value; // 如果获取缓存时,给定的 key 对应的值类型跟当前类型不一致。 if (cacheWrapper.CacheType != CacheType.Normal) { throw new InvalidOperationException($"Operation against a key holding the wrong type '{cacheWrapper.CacheType}'."); } if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return(null); } // 刷新滑动过期时间。 (bool needRestore, CacheWrapper cacheWrapper)refreshResult = cacheWrapper.Refresh(); if (refreshResult.needRestore) { await StateManager.SetStateAsync(key, refreshResult.cacheWrapper); } return(refreshResult.cacheWrapper.Cache); }
/// <summary> /// 清理失效 Cache。 /// </summary> private async Task ClearExpiredCacheAsync(object obj) { IEnumerable <string> stateNames = await StateManager.GetStateNamesAsync(); foreach (string stateName in stateNames) { CacheWrapper state = await StateManager.GetStateAsync <CacheWrapper>(stateName); if (state.IsExpired()) { await StateManager.RemoveStateAsync(stateName); } } }
/// <summary> /// 获取 Hash 主键+次键对应的缓存。 /// </summary> /// <param name="firstKey">主键。</param> /// <param name="secondKey">次键,为空则返回主键对应的缓存。</param> public async Task <string> GetHashCacheAsync(string firstKey, string secondKey) { ConditionalValue <CacheWrapper> state = await StateManager.TryGetStateAsync <CacheWrapper>(firstKey); if (!state.HasValue) { return(null); } CacheWrapper cacheWrapper = state.Value; // 如果获取缓存时,给定的 key 对应的值类型跟当前类型不一致。 if (cacheWrapper.CacheType != CacheType.Hash) { throw new InvalidOperationException($"Operation against a key holding the wrong type '{cacheWrapper.CacheType}'."); } // 若 first key 过期 if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(firstKey); return(null); } // 刷新滑动过期时间。 (bool needRestore, CacheWrapper cacheWrapper)refreshResult = cacheWrapper.Refresh(); if (refreshResult.needRestore) { await StateManager.SetStateAsync(firstKey, refreshResult.cacheWrapper); } Dictionary <string, string> hashCacheWrappers; try { hashCacheWrappers = cacheWrapper.Cache.FromJson <Dictionary <string, string> >(); } catch { throw new ArgumentException($"The cache value which cache key '{firstKey}' is not type of Dictionary<string,string>."); } if (!hashCacheWrappers.TryGetValue(secondKey, out string hashCache)) { return(null); } return(hashCache); }
/// <summary> /// 移除并返回列表中最后一个元素。 /// </summary> /// <param name="key">主键。</param> public async Task <string> RightPopListCacheAsync(string key) { ConditionalValue <CacheWrapper> state = await StateManager.TryGetStateAsync <CacheWrapper>(key); if (!state.HasValue) { return(null); } CacheWrapper cacheWrapper = state.Value; // 如果获取缓存时,给定的 key 对应的值类型跟当前类型不一致。 if (cacheWrapper.CacheType != CacheType.List) { throw new InvalidOperationException($"Operation against a key holding the wrong type '{cacheWrapper.CacheType}'."); } if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return(null); } List <string> caches; try { caches = cacheWrapper.Cache.FromJson <List <string> >(); } catch { throw new InvalidOperationException($"Operation against a key holding the wrong type '{cacheWrapper.CacheType}'."); } if (caches == null || caches.Count == 0) { return(null); } string result = caches.FindLast(t => true); caches.RemoveAt(caches.Count - 1); cacheWrapper.Cache = caches.ToJson(); await StateManager.SetStateAsync(key, cacheWrapper); return(result); }
/// <summary> /// 刷新缓存有效期。 /// </summary> /// <param name="key">缓存键。</param> /// <param name="options">缓存有效期配置</param> public async Task RefreshAsync(string key, KolibreCacheOptions options) { ConditionalValue <CacheWrapper <Student> > result = await StateManager.TryGetStateAsync <CacheWrapper <Student> >(key); if (!result.HasValue) { return; } CacheWrapper <Student> cacheWrapper = result.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return; } await StateManager.SetStateAsync(key, cacheWrapper.Refresh(options)); }
/// <summary> /// 刷新列表缓存。 /// </summary> /// <param name="key">主键。</param> /// <param name="options">The options.</param> public async Task RefreshListCacheAsync(string key, KolibreCacheOptions options) { ConditionalValue <CacheWrapper> state = await StateManager.TryGetStateAsync <CacheWrapper>(key); if (!state.HasValue) { return; } CacheWrapper cacheWrapper = state.Value; if (cacheWrapper.IsExpired()) { await StateManager.RemoveStateAsync(key); return; } await StateManager.SetStateAsync(key, cacheWrapper.Refresh(options)); }