Blazor Server(.NET7)实现MSSQL数据服务器端缓存方案咨询
Blazor Server 服务器端定时缓存数据集实现方案
核心思路
完全可以通过服务器端缓存+定时刷新的方式解决多客户端重复查询数据库的问题。利用Blazor Server的服务器运行特性,在服务端维护一份全局缓存,每分钟主动从数据库拉取最新数据更新缓存,所有客户端直接从缓存读取数据,彻底避免重复DB查询。
具体实现步骤
1. 配置内存缓存
在Program.cs中注册内存缓存服务:
builder.Services.AddMemoryCache(options => { // 可选:设置缓存大小限制,避免内存溢出 options.SizeLimit = 1024 * 1024 * 50; // 50MB });
2. 实现定时刷新的后台服务
创建一个继承自BackgroundService的托管服务,负责每分钟刷新缓存:
public class DataRefreshService : BackgroundService { private readonly IMemoryCache _cache; private readonly IDbDataService _dbService; private readonly ILogger<DataRefreshService> _logger; private readonly TimeSpan _refreshInterval = TimeSpan.FromMinutes(1); public DataRefreshService(IMemoryCache cache, IDbDataService dbService, ILogger<DataRefreshService> logger) { _cache = cache; _dbService = dbService; _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("数据缓存刷新服务启动"); // 启动时先刷新一次缓存,避免客户端初始无数据 await RefreshCacheAsync(); while (!stoppingToken.IsCancellationRequested) { await Task.Delay(_refreshInterval, stoppingToken); await RefreshCacheAsync(); } } private async Task RefreshCacheAsync() { try { // 按页面拉取对应数据集 var dashboardChartData = await _dbService.GetDashboardChartDataAsync(); var realtimeTableData = await _dbService.GetRealtimeTableDataAsync(); // 更新缓存(设置永不过期,由后台主动刷新) _cache.Set("DashboardChartData", dashboardChartData); _cache.Set("RealtimeTableData", realtimeTableData); _logger.LogInformation("缓存已成功更新"); } catch (Exception ex) { _logger.LogError(ex, "缓存更新失败,将使用旧数据"); } } }
然后在Program.cs注册该服务:
builder.Services.AddHostedService<DataRefreshService>();
3. 封装缓存读取服务
创建一个封装缓存操作的服务,简化组件调用:
public interface IDataCacheAccessor { T GetCachedData<T>(string cacheKey); } public class DataCacheAccessor : IDataCacheAccessor { private readonly IMemoryCache _cache; public DataCacheAccessor(IMemoryCache cache) { _cache = cache; } public T GetCachedData<T>(string cacheKey) { return _cache.TryGetValue(cacheKey, out T data) ? data : default; } }
注册服务:
builder.Services.AddScoped<IDataCacheAccessor, DataCacheAccessor>();
4. Blazor组件中使用缓存
在大屏组件中注入服务并读取缓存数据:
@inject IDataCacheAccessor DataCacheAccessor @inject IJSRuntime JSRuntime <h3>实时数据图表</h3> <ChartComponent Data="@_chartData" /> <h3>实时数据表格</h3> <TableComponent Data="@_tableData" /> @code { private DashboardChartModel[] _chartData; private RealtimeTableModel[] _tableData; protected override void OnInitialized() { // 初始加载缓存数据 RefreshDataFromCache(); } // 可选:通过定时器让组件主动刷新(配合缓存更新频率) protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { await JSRuntime.InvokeVoidAsync("setInterval", () => { RefreshDataFromCache(); StateHasChanged(); }, 60000); // 每分钟刷新一次组件 } } private void RefreshDataFromCache() { _chartData = DataCacheAccessor.GetCachedData<DashboardChartModel[]>("DashboardChartData"); _tableData = DataCacheAccessor.GetCachedData<RealtimeTableModel[]>("RealtimeTableData"); } }
5. 多服务器部署扩展(可选)
如果后续需要多服务器集群部署,将内存缓存替换为分布式缓存(如Redis)即可:
// 替换内存缓存为Redis分布式缓存 builder.Services.AddStackExchangeRedisCache(options => { options.Configuration = "your-redis-server:6379"; options.InstanceName = "BlazorDataCache:"; });
后台服务和缓存访问服务无需修改,直接兼容。
参考资料
- .NET 内存缓存官方文档:讲解内存缓存的配置、使用方式及最佳实践
- .NET 托管服务(BackgroundService)官方文档:说明如何创建和部署定时后台任务
- Blazor Server 服务注入文档:指导如何在Blazor组件中注入和使用服务
内容的提问来源于stack exchange,提问作者Stephen Pefanis
相关产品推荐
相关产品推荐

