/// <summary> /// 后台扫描全表数据 /// </summary> /// <typeparam name="TEntity"></typeparam> /// <param name="dbContext">上下文</param> /// <param name="tableCacheTimeSpan">tableCache过期时间</param> private static void ScanTableBackground <TEntity>(DbContext dbContext, TimeSpan tableCacheTimeSpan) where TEntity : class { string scanKey = $"{DefaultValue.CacheKey_TableScanning}{dbContext.TableName}"; //1.判断正在扫描键是否存在,如果存在,则返回null,继续等待扫描任务完成 if (CacheStorageManager.IsExist(dbContext, scanKey)) { return; } //2.如果没有扫描键,则执行后台扫描任务 Task.Run(() => { //设置扫描键,标识当前正在进行扫描 CacheStorageManager.Put(dbContext, scanKey, 1, DefaultValue.SpanScaningKeyExpiredTime); //对扫描任务加锁,防止多线程环境多次执行任务 lock (tableScaningLocker) { //双重校验当前缓存是否存在TableCache,防止多个进程在锁外等待,所释放后再次执行 if (CacheStorageManager.IsExist(dbContext, GetTableCacheKey(dbContext))) { return; } //如果过期时间为0,则取上下文的过期时间 TimeSpan timeSpan = tableCacheTimeSpan == TimeSpan.Zero ? dbContext.TableCacheExpiredTimeSpan : tableCacheTimeSpan; //执行扫描全表任务,并将结果存入缓存中 var data = GetFullTableData <TEntity>(dbContext); if (data != null) { CacheStorageManager.Put(dbContext, GetTableCacheKey(dbContext), data, dbContext.TableCacheExpiredTimeSpan); } } //将扫描键移除,表示已经扫描完成 CacheStorageManager.Delete(dbContext, scanKey); }); }
/// <summary> /// 清空所有缓存 /// </summary> internal static void FlushAllCache(DbContext dbContext) { if (CacheStorageManager.IsExist(dbContext, DefaultValue.GetQueryCacheKeysCacheKey(dbContext.DataBaseName), out HashSet <string> keys)) { foreach (var item in keys) { CacheStorageManager.Delete(dbContext, item); } } }
/// <summary> /// 清空单个表相关的所有缓存 /// </summary> /// <param name="dbContext"></param> internal static void FlushTableCache(DbContext dbContext) { CacheStorageManager.Delete(dbContext, GetQueryCacheKey(dbContext)); }